工具函数 业务 javascript

Array

从数组中删除重复的项

  1. const removeDuplicatedValues = array => […new Set(array)];
  2. let arr = removeDuplicatedValues([5, 3, 2, 5, 6, 1, 1, 6]); // [5, 3, 2, 6, 1]

检查所有项是否相等

  1. const areAllEqual = array => array.every(item => item === array[0]);
  2. let check1 = areAllEqual([3, 5, 2]); // false
  3. let check2 = allEqual([3, 3, 3]); // true

数组对象去重

  1. function unique(arr,u_key) {
  2. let map = new Map()
  3. arr.forEach((item,index)=>{
  4. if (!map.has(item[u_key])){
  5. map.set(item[u_key],item)
  6. }
  7. })
  8. return [...map.values()]
  9. }

按照精度截取数据(一)

  1. /**
  2. * @description: 按照精度截取数据(小数,科学记数法,非四舍五入)
  3. * @param {*}
  4. * @return {*} string
  5. */
  6. export function truncateData(value, decimals) {
  7. let amount = String(value);
  8. let isDealPosint = amount.split(".");
  9. if (!isDealPosint && value * 1 < 0 && isDealPosint.length < 2) {
  10. amount = _toNonExponential(value * 1);
  11. isDealPosint = amount.split(".");
  12. }
  13. if (isDealPosint && isDealPosint.length === 2) {
  14. let integer = isDealPosint[0];
  15. let point = isDealPosint[1];
  16. let maxLength = decimals * 1 + integer.length + 1;
  17. if (point && point.length) return amount.substring(0, maxLength);
  18. }
  19. return amount;
  20. }
  21. /**
  22. * @description: 将科学记数法转化正常计数
  23. * @param {*} num
  24. * @return {*}
  25. */
  26. function _toNonExponential(num) {
  27. var m = num.toExponential().match(/\d(?:\.(\d*))?e([+-]\d+)/);
  28. return num.toFixed(Math.max(0, (m[1] || "").length - m[2]));
  29. }

按照精度截取数据(二)

  1. /**
  2. * @description: 处理合约中数据精度问题
  3. * @param{*}amount
  4. * @param{*}decimals
  5. * @return{*}
  6. */
  7. export function dealDecimals(amount, decimals) {
  8. if (!amount) return 0
  9. let index = amount.length - decimals;
  10. if (index < 1) return _.divide(amount, 10 ** decimals)
  11. amount = String(amount);
  12. const array = [amount.substr(0, index), amount.substr(index, decimals)];
  13. let result = array.join(".");
  14. return result;
  15. }

String

获取选中内容

  1. const getSelectedText = () => window.getSelection().toString();

生成16进制的随机颜色

  1. const randomHexColor = () => `#${Math.floor(Math.random() * 0xffffff).toString(16).padEnd(6, "0")}`
  2. console.log(randomHexColor());

指定长度的数字随机数

  1. /*
  2. * @method 返回随机数据戳
  3. * @param {len = 8} :number 输入的字符串
  4. * callback:string
  5. */
  6. export function createNumberStamp(len = 8) {
  7. let target = 2 + len * 1
  8. return Math.random().toString().slice(2, target)
  9. //或者
  10. return String(Math.random()).slice(2, target)
  11. }

指定范围的随机打印

  1. Math.floor(Math.random()*16)

获取时间戳(毫秒)

  • new Date().getTime()
  • Date.now()
  • Date.parse(newDate()) — 整秒数 ```javascript

function getTimeStamp() { return Date.parse(newDate()) /1000; }

  1. <a name="BATjA"></a>
  2. #### 随机字符串(数字加字母)
  3. ```javascript
  4. function createRandomStr(len = 6) {
  5. var rdmString = "";
  6. for (
  7. ;
  8. rdmString.length < len;
  9. rdmString += Math.random()
  10. .toString(36)
  11. .substr(2)
  12. );
  13. return rdmString.substr(0, len);
  14. }

解析URL携带参数

  1. function parseQuery(val) {
  2. var params = {},
  3. seg = val.replace(/^\?/, '').split('&'),
  4. len = seg.length,
  5. p;
  6. for (var i = 0; i < len; i++) {
  7. if (seg[i]) {
  8. p = seg[i].split('=');
  9. params[p[0]] = p[1];
  10. }
  11. }
  12. return params;
  13. }

复制到粘贴板

  1. function copyHandle(address) {
  2. let copy = (e) => {
  3. e.preventDefault();
  4. e.clipboardData.setData("text/plain", address);
  5. message.success("copy successfully");
  6. document.removeEventListener("copy", copy);
  7. };
  8. document.addEventListener("copy", copy);
  9. document.execCommand("Copy");
  10. }

在字符串中查找给定的单词,并替换为另一个单词

  1. const findAndReplace = (string, wordToFind, wordToReplace) => string.split(wordToFind).join(wordToReplace);
  2. let result = findAndReplace(‘I like banana’, banana’, apple’); // I like apple


判断类型(全部小写)

typeOf方法

typeof 可以返回的类型为:number、string、boolean、undefined、object、function

  • (1)undefined:是所有没有赋值变量的默认值,自动赋值。
  • (2)null:主动释放一个变量引用的对象,表示一个变量不再指向任何对象地址。

    prototype.toString.call方法

    • number
    • string
    • boolean
    • array
    • object
    • regexp
    • function
    • date
  1. /**
  2. * @description: judgeType
  3. * @param {*} target
  4. * @return {number, string, boolean, array, function,object, regexp, date}
  5. */
  6. function _judgeTypes (target) {
  7. return Object.prototype.toString.call(target).replace(/^\[object\s(\w+)\]$/, '$1').toLowerCase()
  8. //return Reflect.apply(Object.prototype.toString, target, []).replace(/^\[object\s(\w+)\]$/, '$1').toLowerCase()
  9. }

文本数据脱敏

  1. /**
  2. * @description: 长文本省略中间部分
  3. * @param {string} str 文本内容
  4. * @param {number} start 保留文本头部长度
  5. * @param {number} end 保留文本尾部长度
  6. * @return {string}
  7. */
  8. export function ellipsisStr(str, start = 6, end = 4) {
  9. if (typeof str === "string") {
  10. return str.slice(0, start) + "..." + str.slice(-end);
  11. }
  12. return str;
  13. }

Number

匹配并且筛选出数字

  1. //1
  2. let size = '152270110KB'
  3. let matchArr = size.match(/\d+/g)
  4. console.log(matchArr) ["152270110"]
  5. // 2
  6. let size = '152270110KB'
  7. size.match(/(\d+)[KB]/gi)
  8. console.log(RegExp.$1) "152270110"

截取金额数据(非四舍五入)

  1. /**
  2. * @description: 截取金额数据(非四舍五入)
  3. * @param {*} number
  4. * @param {*} length
  5. * @return {*}
  6. */
  7. export function toFixed(number, length = 2) {
  8. return Math.floor(Math.pow(10, length) * number) / Math.pow(10, length);
  9. }

将科学记数法转化正常计数

  1. /**
  2. * @description: 将科学记数法转化正常计数
  3. * @param {*} num
  4. * @return {*}
  5. */
  6. function _toNonExponential(num) {
  7. var m = num.toExponential().match(/\d(?:\.(\d*))?e([+-]\d+)/);
  8. return num.toFixed(Math.max(0, (m[1] || "").length - m[2]));
  9. }

算法取整

  1. Math.round(x) 四舍五入
  2. Number.prototype.toFixed 四舍五入
  3. Math.floor(x) 向下舍入
  4. Math.ceil(x) 向上舍入
  5. parseInt(7/2) 保留整数部分

弧度换角度

  1. const radianToDegree = radian => (radian * 180.0) / Math.PI;
  2. let degree = radianToDegree(2.3); // 131.78


环境

打开浏览器(防止拦截)

  1. /**
  2. * @description: open other URL (防拦截)
  3. * @param {*} url
  4. * @param {*} id
  5. * @return {*}
  6. */
  7. export function openUrl(url, id = "default") {
  8. var a = document.createElement("a");
  9. a.setAttribute("href", url);
  10. a.setAttribute("target", "_blank");
  11. a.setAttribute("id", id);
  12. // 防止反复添加
  13. if (!document.getElementById(id)) {
  14. document.body.appendChild(a);
  15. }
  16. a.click();
  17. }

回到页面顶部

  1. const scrollToTop = () => {
  2. const t = document.documentElement.scrollTop || document.body.scrollTop;
  3. if (t > 0) {
  4. window.requestAnimationFrame(scrollToTop);
  5. window.scrollTo(0, t t / 8);
  6. }
  7. };

判断是否为苹果系统

  1. export const isAppleMobileDevice = () => {
  2. let reg = /iphone|ipod|ipad|Macintosh/i;
  3. return reg.test(navigator.userAgent.toLowerCase());
  4. }

判断微信环境

  1. export function is_wechat () {
  2. var ua = navigator.userAgent.toLowerCase()
  3. return ua.match(/MicroMessenger/i) == 'micromessenger';
  4. }

JSAPI微信内支付(ios,安卓支付正常)

  1. export function jsSDK (params) {
  2. if (typeof window.WeixinJSBridge === 'undefined') {
  3. if (document.addEventListener) {
  4. document.addEventListener('WeixinJSBridgeReady', function () { onBridgeReady(params) }, false)
  5. } else if (document.attachEvent) {
  6. document.attachEvent('WeixinJSBridgeReady', function () { onBridgeReady(params) })
  7. document.attachEvent('onWeixinJSBridgeReady', function () { onBridgeReady(params) })
  8. }
  9. } else {
  10. onBridgeReady(params)
  11. }
  12. }
  13. function onBridgeReady (params) {
  14. window.WeixinJSBridge.invoke(
  15. 'getBrandWCPayRequest', {
  16. 'appId': params.appId, // 公众号名称,由商户传入
  17. 'timeStamp': params.timeStamp, // 时间戳,自1970年以来的秒数
  18. 'nonceStr': params.nonceStr, // 随机串
  19. 'package': params.package,
  20. 'signType': params.signType, // 微信签名方式:
  21. 'paySign': params.paySign // 微信签名
  22. },
  23. function (res) {
  24. if (res.err_msg === 'get_brand_wcpay_request:ok') {
  25. // 使用以上方式判断前端返回,微信团队郑重提示:
  26. // res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
  27. location.href = 'https://test.develop.privhub.com/pay/success'
  28. } else {
  29. location.href = 'https://test.develop.privhub.com/pay/fail'
  30. }
  31. }
  32. )
  33. }

分享到此结束,可能还可以优化,维护更少的变量,目前没有好主意,如果有新的想法的伙伴请email到webkubor@163.com