zoukankan      html  css  js  c++  java
  • JavaScript 一些常用的js处理方法整理

    /**
     * @param {Function} ios回调
     * @param {Function} Android回调
     * @description 识别设备终端类型执行回调
     */
    function dealDeviceCallback (iosFn, adrFn) {
      var UA = navigator.userAgent;
      var android = UA.indexOf('Android') > -1 || UA.indexOf('Adr') > -1;
      var iOS = !!UA.match(/(i[^;]+;( U;)? CPU.+Mac OS X/);
    
      if (iOS) {
        iosFn();
      }
      if (android) {
        adrFn();
      }
    }
    
    /**
     * @description 获取路径参数
     * @returns {Object}
     */
    function getUrlParams () {
      var url = decodeURIComponent(window.location.toString());
      var arrObj = url.split('?');
      var params = Object.create(null);
      if (arrObj.length > 1) {
        arrObj = arrObj[1].split('&');
        arrObj.forEach(function (item) {
          item = item.split('=');
          params[item[0]] = item[1]
        })
      }
      return params;
    }
    
    /**
     * @param {Array} arr 传入的数组对象 
     * @param {Function} fn 回调函数  支持传入三个参数 遍历的元素item, 下标 i, 原始数组对象 arr 
     * @description 自定义遍历 回调处理
     */ 
    function mkForEach(arr, fn) {
      if (!arr || !arr.length) return;
      var i = -1;
      var len = arr.length;
      while (++i < len) {
        var item = arr[i];
        fn (item, i, arr)
      }
    }
    
    /**
     * 
     * @param {Array} arr1
     * @param {Array} arr2
     * @description 得到两个数组的交集,数组的元素为数值或字符串
     * @returns {Array}
     */ 
    function getIntersection (arr1, arr2) {
      var len = Math.min(arr1.length, arr2.length);
      var i = -1;
      var res = [];
    
      while (++i < len) {
        var item = arr2[i];
        if (arr1.indexOf(item) > -1) res.push(item);
      }
      return res;
    }
    
    
    /**
     * 
     * @param {Aarray} arr1
     * @param {Aarray} arr2
     * @description 得到两个数组的并集,数组的元素为数值或字符串
     * @returns {Array}
     */ 
    function getUnion (arr1, arr2) {
      var len = arr2.length;
      var i = -1;
      var res = [];
    
      while (++i < len) {
        var item = arr2[i];
        if (arr1.indexOf(item) === -1) res.push(item);
      }
      return arr1.concat(res);
    }
    
    /**
     * 
     * @param {Aarray} targetArr
     * @param {Aarray} arr * 
     * @description 判断已知数组是否至少有一个元素包含在目标数组内
     */ 
    function hasOneOf (targetArr, arr) {
      return targetArr.some(_ => arr.indexOf(_) > -1);
    }
    
    /** 
     * @description 检查数据是否是非数字值 原生的isNaN 会把参数转化成数字(valueof)。
     * 且null, true, false以及长度小于等于1的数组(元素为非NaN的数据). 
     * Symbol不具有valueof接口,所以isNaN会抛出错误。这里放在最后避免出错。
     * @returns {Boolean}
    */
    function mkIsNaN (v) {
      return !(typeof v === 'string' || typeof v === 'number') || isNaN(v)
    }
    
    /**
     * 
     * @param {Array} arr 
     * @description 返回数组中非NaN数据中的最大值
     * @returns Max
     */
    function mkMax (arr) {
      arr = arr.filter(function (item) {
        return !mkIsNaN(item)
      });
      return arr.length ? Math.max.apply(null, arr) : undefined;
    }
    
    /**
     * 
     * @param {Array} arr 
     * @description 返回数组中非NaN数据中的最小值
     * @returns Min
     */
    function mkMin (arr) {
      arr = arr.filter(function (item) {
        return !mkIsNaN(item)
      });
      return arr.length ? Math.min.apply(null, arr) : undefined;
    }
    
    /**
     * 
     * @param {Number} lower 
     * @param {Number} Upper
     * @description 返回一个lower - upper 之间的随机数
     * @returns {Number}
     */
    function mkRandom (lower, upper) {
      lower = +lower || 0;
      upper = +upper || 0;
      return Math.random() * (upper - lower) + lower;
    }
    
    /**
     * @param {Number} timeStamp 时间戳
     * @description 判断当前时间戳是否为毫秒级
     * @returns {Boolean} 
     */
    
    function isMillisecond (timeStamp) {
      var timeStr = timeStamp.toString();
      return timeStr.length > 10;
    }
    
    /**
     * @param {Number} timeStamp 对比时间戳
     * @param {Number} currentTime 当前时间戳
     * @returns {Boolean} 是否比当前时间早
     */
    
    function isEarly (timeStamp, currentTime) {
      return timeStamp < currentTime
    }
    
    /** 
     * @param {Number} num 数值
     * @returns {String} 处理后的字符串
     * @description 如果传入的数值小于10, 则在前面补充0
     */
    function singleToDouble (num) {
      return num < 10 ? '0' + num : num;
    }
    
    /**
     * @description 时间戳格式化处理 这种方法参数少 凡是对与第一个参数的限制提高了,不需要符合相应的格式
     * @param {String} formatter 时间格式
     * @param {Number} timeStamp 时间戳 不传则取系统当前时间
     * @returns {String}
     */
    function formatterDateReg (formatter, timeStamp) {
      timeStamp = timeStamp || new Date().getTime();
      var _d = isMillisecond(timeStamp) ? new Date(timeStamp) : new Date(timeStamp * 1000);
      var Y = _d.getFullYear() + '';
      var M = singleToDouble(_d.getMonth() + 1);
      var D = singleToDouble(_d.getDate());
      var H = singleToDouble(_d.getHours());
      var m = singleToDouble(_d.getMinutes());
      var s = singleToDouble(_d.getSeconds());
      return formatter.replace(/YYYY|yyyy/g, Y)
          .replace(/YY|yy/g, Y.substr(2,2))
          .replace(/MM/g, M)
          .replace(/DD/g, D)
          .replace(/HH|hh/g, H)
          .replace(/mm/g, m)
          .replace(/ss/g, s)
    }
    
    /**
     * Convert a base64 string in a Blob according to the data and contentType.
     *
     * @param {String} b64Data  Pure base64 string without contentType
     * @param {String} contentType  the content type of the file i.e (image/jpeg - image/png - text/plain)
     * @param {Int} sliceSize  SliceSize to process the byteCharacters
     * @see http://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript
     * @returns Blob
     */
    function b64toBlob(b64Data, contentType, sliceSize) {
      contentType = contentType || '';
      sliceSize = sliceSize || 512;
    
      var byteCharacters = atob(b64Data);
      var byteArrays = [];
    
      for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
          var slice = byteCharacters.slice(offset, offset + sliceSize);
    
          var byteNumbers = new Array(slice.length);
          for (var i = 0; i < slice.length; i++) {
              byteNumbers[i] = slice.charCodeAt(i);
          }
    
          var byteArray = new Uint8Array(byteNumbers);
    
          byteArrays.push(byteArray);
      }
    
      var blob = new Blob(byteArrays, {type: contentType});
      return blob;
    }
    
    /** 
     * @param {String} imgUrl 原始base64字符串 带有文件类型信息
     * @param {String} fileName 转成File对象之后的文件名
     * @description base64 对象转File 对象 (中间必须要先转为blob对象)
    */ 
    
    function b64ToFile (imgUrl, fileName) {
      fileName = fileName || 'file' + parseInt(mkRandom(1, (new Date().getTime() / 1000)));
    
      var block = imgUrl.split(';');
      var contentType = block[0].split(':')[1];
    
      var realData = block[1].split(',')[1];
      
      var blobObj = b64toBlob(realData, contentType);
      
      var fileObj = new File([blobObj], fileName + '.' + contentType.split('/')[1]);
      
      return fileObj;
    }
    
    /**
     * 
     * @param {Number} num 
     * @description 这个可以验证15位和18位的身份证,并且包含生日和校验位的验证。如果有兴趣,还可以加上身份证所在地的验证,就是前6位有些数字合法有些数字不合法。 
     */
    function isIdCardNo(num) {
      num = num.toUpperCase();
      //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
      if (!(/(^d{15}$)|(^d{17}([0-9]|X|x)$)/.test(num))) {
        // alert('输入的身份证号长度不对,或者号码不符合规定!
    15位号码应全为数字,18位号码末位可以为数字或X。');
        return false;
      }
      //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
      //下面分别分析出生日期和校验位
      var len, re;
      len = num.length;
      if (len == 15) {
        re = new RegExp(/^(d{6})(d{2})(d{2})(d{2})(d{3})$/);
        var arrSplit = num.match(re);
        //检查生日日期是否正确
        var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);
        var bGoodDay;
        bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2]))
            && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3]))
            && (dtmBirth.getDate() == Number(arrSplit[4]));
        if (!bGoodDay) {
          // alert('输入的身份证号里出生日期不对!');
          return false;
        } else {
          //将15位身份证转成18位
          //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
          var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5,
              8, 4, 2);
          var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4',
              '3', '2');
          var nTemp = 0, i;
          num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);
          for (i = 0; i < 17; i++) {
            nTemp += num.substr(i, 1) * arrInt[i];
          }
          num += arrCh[nTemp % 11];
          return num;
        }
      }
      if (len == 18) {
        re = new RegExp(/^(d{6})(d{4})(d{2})(d{2})(d{3})([0-9]|X|x)$/);
        var arrSplit = num.match(re);
        //检查生日日期是否正确
        var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/"
            + arrSplit[4]);
        var bGoodDay;
        bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2]))
            && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3]))
            && (dtmBirth.getDate() == Number(arrSplit[4]));
        if (!bGoodDay) {
          // alert(dtmBirth.getYear());
          // alert(arrSplit[2]);
          // alert('输入的身份证号里出生日期不对!');
          return false;
        } else {
          //检验18位身份证的校验码是否正确。
          //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
          var valnum;
          var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5,
              8, 4, 2);
          var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4',
              '3', '2');
          var nTemp = 0, i;
          for (i = 0; i < 17; i++) {
            nTemp += num.substr(i, 1) * arrInt[i];
          }
          valnum = arrCh[nTemp % 11];
          if (valnum != num.substr(17, 1)) {
            // alert('18位身份证的校验码不正确!应该为:' + valnum);
            return false;
          }
          return num;
        }
      }
      return false;
    }
     1    /**
     2      * 
     3      * @param {String} v1 当前版本号
     4      * @param {String} v2 对比参照版本号
     5      */
     6     function  compareVersion (v1, v2) {
     7         v1 = v1.split('.')
     8         v2 = v2.split('.')
     9         var len = Math.max(v1.length, v2.length);
    10         while (v1.length < len) {
    11             v1.push('0')
    12         }
    13         while (v2.length < len) {
    14             v2.push('0')
    15         }
    16         for (var i = 0; i < len; i++) {
    17             var num1 = parseInt(v1[i]);
    18             var num2 = parseInt(v2[i]);
    19 
    20             if (num1 > num2) {
    21                 return 1
    22             } else if (num1 < num2) {
    23                 return -1
    24             }
    25         }
    26         return 0
    27     }        
    // 判断设备系统类型
    function checkSystem () {
        var u = navigator.userAgent
        var browserVersion = (function () {
            return {
                ios: !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
                android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或者uc浏览器
                iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1, //是否为iPhone或者QQHD浏览器
                iPad: u.indexOf('iPad') > -1 //是否iPad
            }
        })()
    
        var isIOS = (function () {
            if (browserVersion.ios || browserVersion.iPhone || browserVersion.iPad) {
                return true
            } else {
                return false
            }
        })()
        
        var isAndroid = (function () {
            return browserVersion.android
        })()
    
        return {
            iOS: isIOS,
            Android: isAndroid
        }
    }
  • 相关阅读:
    港湾交换机-交换机配置
    华为交换机-SNMP配置
    H3C交换机-SNMP配置
    CISCO交换机-SNMP配置
    docker容器与宿主交互数据
    MYSQL总览
    mysql数据类型优化
    compact 创建一个包含变量名为数组的键和它们的值为数组的值的数组
    php单例模式
    完形填空格式
  • 原文地址:https://www.cnblogs.com/matthewkuo24/p/14060449.html
Copyright © 2011-2022 走看看