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
    }
}
原文地址:https://www.cnblogs.com/matthewkuo24/p/14060449.html