请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1725|回复: 0

工具函数对象书写例子,可自己扩展

[复制链接]

821

主题

821

帖子

2663

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2663
发表于 2019-8-30 08:48:57 | 显示全部楼层 |阅读模式
  1. const Utils = {
  2.   _typeof (obj) {
  3.     return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
  4.   },
  5.   isString (o) { //是否字符串
  6.     return Utils._typeof(obj) === 'string'
  7.   },
  8.   isNumber (o) { //是否数字
  9.       return Utils._typeof(obj) === 'number'
  10.   },
  11.   isBoolean (o) { //是否boolean
  12.       return Utils._typeof(obj) === 'boolean'
  13.   },
  14.   isFunction (o) { //是否函数
  15.       return Utils._typeof(obj) === 'function'
  16.   },
  17.   isNull (o) { //是否为null
  18.       return Utils._typeof(obj) === 'null'
  19.   },
  20.   isUndefined (o) { //是否undefined
  21.       return Utils._typeof(obj) === 'undefined'
  22.   },
  23.   isArray (o) { //是否数组
  24.       return Utils._typeof(obj) === 'array'
  25.   },
  26.   isDate (o) { //是否时间
  27.       return Utils._typeof(obj) === 'date'
  28.   },
  29.   /*是否是纯粹的对象*/
  30.   isPlainObject (obj) {
  31.     return Utils._typeof(obj) === 'object';
  32.   },
  33.   isString (obj) {
  34.     return typeof (obj) === 'string';
  35.   },
  36.   /*是否是空数组*/
  37.   isNonEmptyArray (obj = []) {
  38.     return obj && obj.length > 0 && Array.isArray(obj) && typeof obj !== 'undefined';
  39.   },
  40.   /*是否是对象*/
  41.   isObject (item) {
  42.     return (item && typeof item === 'object' && !Array.isArray(item));
  43.   },
  44.   /*是否是空对象*/
  45.   isEmptyObject (obj) {
  46.     return Object.keys(obj).length === 0 && obj.constructor === Object;
  47.   },
  48.   //对象是否包含某属性
  49.   isIncludeAttr(obj, attr) {
  50.     //判断是否有该键值
  51.     if (obj && obj.hasOwnProperty(attr)) {
  52.       //如果有返回true
  53.       return true;
  54.     }
  55.       return false;
  56.    
  57.   },
  58.   decodeIconFont (text) {
  59.     // 正则匹配 图标和文字混排 eg: 我去上学校,天天不迟到
  60.     const regExp = /&#x[a-z|0-9]{4,5};?/g;
  61.     if (regExp.test(text)) {
  62.       return text.replace(new RegExp(regExp, 'g'), function (iconText) {
  63.         const replace = iconText.replace(/&#x/, '0x').replace(/;$/, '');
  64.         return String.fromCharCode(replace);
  65.       });
  66.     } else {
  67.       return text;
  68.     }
  69.   },
  70.   /*深拷贝*/
  71.   mergeDeep (target) {
  72.     let tempObj = Array.isArray(target)?[]:{};
  73.     for(let key in target){
  74.       tempObj[key] = Utils.isObject(target[key])?Util.mergeDeep(target[key]):target[key];
  75.     }
  76.     return tempObj;
  77.   },

  78.   /**
  79.    * 分割数组
  80.    * @param arr 被分割数组
  81.    * @param size 分割数组的长度
  82.    * @returns {Array}
  83.    */
  84.   arrayChunk (arr = [], size = 4) {
  85.     let groups = [];
  86.     if (arr && arr.length > 0) {
  87.       groups = arr.map((e, i) => {
  88.         return i % size === 0 ? arr.slice(i, i + size) : null;
  89.       }).filter(e => {
  90.         return e;
  91.       });
  92.     }
  93.     return groups;
  94.   },
  95.   /*
  96.    * 截断字符串
  97.    * @param str 传入字符串
  98.    * @param len 截断长度
  99.    * @param hasDot 末尾是否...
  100.    * @returns {String}
  101.    */
  102.   truncateString (str, len, hasDot = true) {
  103.     let newLength = 0;
  104.     let newStr = '';
  105.     let singleChar = '';
  106.     const chineseRegex = /[^\x00-\xff]/g;
  107.     const strLength = str.replace(chineseRegex, '*').length;
  108.     for (let i = 0; i < strLength; i++) {
  109.       singleChar = str.charAt(i).toString();
  110.       if (singleChar.match(chineseRegex) !== null) {
  111.         newLength += 2;
  112.       } else {
  113.         newLength++;
  114.       }
  115.       if (newLength > len) {
  116.         break;
  117.       }
  118.       newStr += singleChar;
  119.     }

  120.     if (hasDot && strLength > len) {
  121.       newStr += '...';
  122.     }
  123.     return newStr;
  124.   },
  125.   /*
  126.    * 转换 obj 为 url params参数
  127.    * @param obj 传入对象
  128.    * @param isEncodeURIComponent 是否编码,默认不编码
  129.    * @returns {String}
  130.    * eg. objToParams({name:'大佬',age:18})
  131.    */
  132.   objToParams (obj,isEncodeURIComponent=false) {
  133.     let str = "";
  134.     for (let key in obj) {
  135.       if (str !== "") {
  136.         str += "&";
  137.       }
  138.       str += key + "=" + (isEncodeURIComponent?encodeURIComponent(obj[key]):obj[key]);
  139.     }
  140.     return str;
  141.   },
  142.   /*
  143.    * 转换 url params参数为obj
  144.    * @param str 传入url参数字符串
  145.    * @param isDecodeURI 是否解码,默认不解码
  146.    * @returns {Object}
  147.    * eg. paramsToObj('http://www.cctv.com?name=大佬&age=18')
  148.    */
  149.   paramsToObj (str,isDecodeURI=false) {
  150.     let obj = {};
  151.     str = str.substring(str.indexOf('?')+1);
  152.     try {
  153.       obj = JSON.parse('{"' + (isDecodeURI?decodeURI(str):str).replace(/"/g, '\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}')
  154.     } catch (e) {
  155.       console.log(e);
  156.     }
  157.     return obj;
  158.   },
  159.   /*
  160.    *保留n位小数
  161.    *@param num {Number|String} 原数字 1.33或者'1.33'
  162.    *@returns {String} 返回字符串
  163.    */
  164.   toThousands(num,n) {
  165.     return parseFloat(num).toFixed(n).replace(/(\d{1,3})(?=(\d{3})+(?:\.))/g, "$1,");
  166.   },
  167.   /*
  168.    *生成两位整数之间的随机整数(包括两端的整数 )
  169.    *
  170.    **/
  171.   randomA(min, max) {
  172.     return Math.floor(Math.random() * (max - min + 1)) + min;
  173.   },
  174.   /*
  175.    *生成两位整数之间的随机整数(不包括两端的整数)
  176.    *
  177.    **/
  178.   randomB(min, max) {
  179.     min+=1,max-=1;
  180.     return Math.floor(Math.random() * (max - min + 1)) + min;
  181.   },

  182.   /*时间格式化*/
  183.   formatTime(obj, format) {
  184.     if(format){
  185.       var date;
  186.       if (obj instanceof Date) {
  187.         date = obj;
  188.       } else {
  189.         date = new Date(obj);
  190.       }
  191.       var dayNames = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日',]

  192.       var o = {
  193.         'M+': date.getMonth() < 9 ? "0" + (date.getMonth() + 1) : (date.getMonth() + 1), // 月份
  194.         'd+': date.getDate() < 10 ? "0" + date.getDate() : date.getDate(), // 日
  195.         'h+': date.getHours(), // 小时
  196.         'm+': date.getMinutes(), // 分
  197.         's+': date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds(), // 秒
  198.         'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
  199.         'S+': date.getMilliseconds(), // 毫秒
  200.         'D+': dayNames[date.getDay()], //星期
  201.       };

  202.       if (/(y+)/.test(format)) format = format.replace(RegExp.$1, (`${date.getFullYear()}`).substr(4 - RegExp.$1.length));
  203.       for (var k in o) {
  204.         if (new RegExp(`(${k})`).test(format)) {
  205.           format = format.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : ((`00${o[k]}`).substr((`${o[k]}`).length)));
  206.         }
  207.       }
  208.       return format;
  209.     }else{
  210.       let date = new Date(obj)
  211.       let _year = date.getFullYear(),
  212.         _month = (date.getMonth()+1) > 9 ? (date.getMonth()+1) : '0' + (date.getMonth()+1),
  213.         _date = date.getDate(),
  214.         _hour = date.getHours(),
  215.         _minute = date.getMinutes(),
  216.         _second = date.getSeconds()
  217.       return _year + '-' + _month + '-' + _date + ' ' + _hour + ':' + _minute + ':' + _second
  218.     }
  219.   },
  220.   /*去掉首尾空格*/
  221.   trimStr(str) {
  222.     return str.replace(/(^\s*)|(\s*$)/g,"");
  223.   },
  224.   /*正则匹配*/
  225.   checkStr (str, type) {
  226.     switch (type) {
  227.         case 'phone':   //手机号码
  228.             return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str);
  229.         case 'tel':     //座机
  230.             return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
  231.         case 'card':    //身份证
  232.             return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);
  233.         case 'pwd':     //密码以字母开头,长度在6~18之间,只能包含字母、数字和下划线
  234.             return /^[a-zA-Z]\w{5,17}$/.test(str)
  235.         case 'postal':  //邮政编码
  236.             return /[1-9]\d{5}(?!\d)/.test(str);
  237.         case 'QQ':      //QQ号
  238.             return /^[1-9][0-9]{4,9}$/.test(str);
  239.         case 'email':   //邮箱
  240.             return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
  241.         case 'money':   //金额(小数点2位)
  242.             return /^\d*(?:\.\d{0,2})?$/.test(str);
  243.         case 'URL':     //网址
  244.             return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)
  245.         case 'IP':      //IP
  246.             return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str);
  247.         case 'date':    //日期时间
  248.             return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
  249.         case 'number':  //数字
  250.             return /^[0-9]$/.test(str);
  251.         case 'positiveInteger':  //正整数
  252.             return /^[1-9]\d*$/.test(str);
  253.         case 'price':  //价格
  254.             return /(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/.test(str);//价格非0则去掉'?'
  255.         case 'english': //英文
  256.             return /^[a-zA-Z]+$/.test(str);
  257.         case 'chinese': //中文
  258.             return /^[\u4E00-\u9FA5]+$/.test(str);
  259.         case 'lower':   //小写
  260.             return /^[a-z]+$/.test(str);
  261.         case 'upper':   //大写
  262.             return /^[A-Z]+$/.test(str);
  263.         case 'HTML':    //HTML标记
  264.             return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);
  265.         default:
  266.             return true;
  267.     }
  268.   },
  269.   /**
  270.    * @param  {s} 秒数
  271.    * @return {String} 字符串
  272.    *
  273.    * @example formatHMS(3610) // -> 1h0m10s
  274.    */
  275.   formatHMS (s) {
  276.       var str = ''
  277.       if (s > 3600) {
  278.           str = Math.floor(s/3600)+'h'+Math.floor(s%3600/60)+'m'+s%60+'s'
  279.       }else if(s > 60) {
  280.           str = Math.floor(s/60)+'m'+s%60+'s'
  281.       }else{
  282.           str = s%60+'s'
  283.       }
  284.       return str
  285.   },
  286.   //根据月份获取起止时间戳
  287.   getTimeFromMonth(year, month){
  288.       return [
  289.           new Date(year, month - 1, 1).getTime()/1000,
  290.           new Date(year, month, 0).getTime()/1000
  291.       ]
  292.   },
  293. //根据日期获取一天起止时间戳
  294.    getTimeFromDay(year, month,day){
  295.          return [
  296.                new Date(year, month-1 , day).getTime()/1000,
  297.                new Date(year, month-1, (day+1)).getTime()/1000
  298.           ]
  299.   },
  300.   /*数组删除指定元素*/
  301.   remove (arr, ele) {
  302.       var index = arr.indexOf(ele);
  303.       if(index > -1) {
  304.           arr.splice(index, 1);
  305.       }
  306.       return arr;
  307.   },
  308.   // 数组求并集
  309.   union (a,b) {
  310.     return [...new Set([...a, ...b])];
  311.   },
  312.   // 数组求交集
  313.   intersect (a,b) {
  314.     return [...new Set([...a].filter(x => b.includes(x)))];
  315.   },
  316.   //数组求差集
  317.   difference (a,b) {
  318.     return [...new Set([...a].filter(x => !b.includes(x)))];
  319.   },
  320.   //数组内部交换
  321.   internalExchange (n,m,arr) {
  322.     [arr[n],arr[m]] = [arr[m],arr[n]];
  323.   } ,
  324.   //数组去重
  325.   Deduplication (arr) {
  326.     return [...new Set([...arr])]
  327.   },
  328.   /*数组最大值*/
  329.   max (arr) {
  330.       return Math.max.apply(null, arr);
  331.   },
  332.   /*数组最小值*/
  333.   min (arr) {
  334.       return Math.min.apply(null, arr);
  335.   },
  336.   //字符串首字母变大写
  337.   changeIndexToUpperCase(str){
  338.     return str.replace(/\b\w+\b/g, function (word) {
  339.         return word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase();
  340.     });
  341.   },
  342. //float偏移处理 eg.  1.67*100结果会偏移,使用mul(1.67*100)
  343. mul(a, b) {
  344.     let c = 0,
  345.         d = a.toString().replace(',',''),
  346.         e = b.toString();
  347.     try {
  348.         c += d.split(".")[1].length;
  349.     } catch (f) {}
  350.     try {
  351.         c += e.split(".")[1].length;
  352.     } catch (f) {}
  353.     return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
  354.   }
  355. }
复制代码
例子
调用方法
  1. Utils .mul(a,b);
  2. Utils .changeIndexToUpperCase(str)
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

用户反馈
客户端