Newer
Older
dxdpCollect / src / components / common / util.js
StephanieGitHub on 25 Apr 2020 6 KB first commit
let Util = {
  /***
   * 将任意数量对象或者字符串传入该方法,若有任意一个为空,则返回true
   * 可判断 空对象 空数组 空字符串 undefined null
   * @returns {boolean}
   */
  isEmpty: function (){
    let len = arguments.length;
    if(len===0){ return true; }
    for(let i=0;i<len;i++){
      let a = arguments[i];
      if(typeof a === "undefined" || a == null || (typeof a === "string" && a.trim() === "")){
        return true;
      }else if(typeof a === "object"){
        let flg = true;
        for (let k in a ) {
          flg=false;
          break;
        }
        if(flg){ return true; }
      }
    }
    return false;
  },
  isFunction: function(fn) {
    return typeof fn === "function" && typeof fn.nodeType !== "number";
  },
  isPlainObject: function( obj ) {
    let proto, Ctor, class2type = {}, toString = class2type.toString, hasOwn = class2type.hasOwnProperty, fnToString = hasOwn.toString, ObjectFunctionString = fnToString.call( Object );
    if ( !obj || toString.call( obj ) !== "[object Object]" ) {
      return false;
    }
    proto = Object.getPrototypeOf( obj );
    if ( !proto ) {
      return true;
    }
    Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
    return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
  },
  isInteger: function(obj) {
    return typeof obj === 'number' && obj%1 === 0;
  },
  extendCopy:function(s,t) {
    for (let i in t) {
      if(!this.isEmpty(s[i]))
        t[i] = s[i];
    }
  },
  /***
   * 对象扩展,支持深拷贝
   * 参数:[deep],target,object1,[objectN]
   */
  extend:function() {
    let options, name, src, copy, copyIsArray, clone, target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false;
    // 如果第一个参数是布尔类型,则判断是否是深拷贝
    if ( typeof target === "boolean" ) {
      deep = target;
      // 如果是深拷贝,则取出第二个参数作为target
      target = arguments[ i ] || {};
      i++;
    }
    // Handle case when target is a string or something (possible in deep copy)
    if ( typeof target !== "object" && !Util.isFunction( target ) ) {
      target = {};
    }
    for ( ; i < length; i++ ) {
      if ( ( options = arguments[ i ] ) != null ) {
        for ( name in options ) {
          src = target[ name ];
          copy = options[ name ];
          // 如果两者完全一样就跳出当前循环,防止死循环
          if ( target === copy ) {
            continue;
          }
          // 只处理普通对象和数组类型
          if ( deep && copy && ( Util.isPlainObject( copy ) ||
              ( copyIsArray = Array.isArray( copy ) ) ) ) {
            if ( copyIsArray ) {
              copyIsArray = false;
              clone = src && Array.isArray( src ) ? src : [];
            } else {
              clone = src && Util.isPlainObject( src ) ? src : {};
            }
            // 递归扩展
            target[ name ] = Util.extend( deep, clone, copy );
          } else if ( copy !== undefined ) {
            target[ name ] = copy;
          }
        }
      }
    }
    return target;
  },
  /***
   * 批量修改对象中日期格式,将时间戳修改为日期字符串
   * item为对象,keys为对象中需要修改的key,format为日期格式
   */
  dateToString: function (item,keys,format) {
    format = this.isEmpty(format)?"yyyy-MM-dd HH:mm:ss":format
    for(let i=0;i<keys.length;i++){
      if(!this.isEmpty(item[keys[i]])){
        item[keys[i]] = new Date(item[keys[i]]).format(format);
      }
    }
  },
  stringToInt: function (item,keys) {
    for(let i=0;i<keys.length;i++){
      if(!this.isEmpty(item[keys[i]])){
        item[keys[i]] = parseInt(item[keys[i]]);
      }
    }
  },
  /***
   * 批量修改对象中数字格式,将数字修改为金额格式
   * item为对象,keys为对象中需要修改的key,n为小数点保留位数
   */
  numberFormat:function(item,keys,n){
    n = this.isEmpty(n)?"2":n
    for(let i=0;i<keys.length;i++){
      let num = item[keys[i]];
      n = n > 0 && n <= 20 ? n : 2;
      num = parseFloat((num + "").replace(/[^\d\.-]/g, "")).toFixed(n) + "";
      let l = num.split(".")[0].split("").reverse(), r = num.split(".")[1],t = "";
      for (let j = 0; j < l.length; j++) {
        t += l[j] + ((j + 1) % 4 === 0 && (j + 1) !== l.length ? "," : "");
      }
      item[keys[i]] = t.split("").reverse().join("") + "." + r;
    }
  },
  checkIDCard: function(rule, value, callback) {
    setTimeout(function(){
      if (!value) {
        return callback(new Error('请输入身份证号码'));
      }
      let reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
      if(reg.test(value) === false){
        return callback(new Error('输入的身份证号码无效'));
      }
      callback();
    }, 200);
  },
  checkPhone: function(rule, value, callback) {
    setTimeout(function(){
      if (!value) {
        return callback(new Error('请输入联系方式'));
      }
      let reg = /^1[3|4|5|7|8][0-9]{9}$/;
      if(reg.test(value) === false){
        return callback(new Error('输入的手机号码无效'));
      }
      callback();
    }, 200);
  },
  checkUsername: function(rule, value, callback) {
    setTimeout(function(){
      let reg_first = /^[a-zA-Z_-]$/,reg = /^[a-zA-Z_-]([a-zA-Z0-9_.-]){5,19}$/;
      if (!value) {
        return callback(new Error('请输入用户名'));
      }else if(reg_first.test(value.substr(0,1)) === false){
        return callback(new Error('请输入以a-zA-Z_-开头的内容'));
      }else if(value.length < 6){
        return callback(new Error('用户名最小长度为6'));
      }else if(value.length > 20){
        return callback(new Error('用户名最大长度为20'));
      }else if(reg.test(value) === false){
        return callback(new Error('输入内容只能包含a-zA-Z0-9_.-'));
      }
      callback();
    }, 200);
  },
  checkNumber: function(rule, value, callback) {
    setTimeout(function(){
      if(rule.required && !value){
        return callback(new Error(rule.requiredMessage));
      }
      if(value){
        let reg = /^[1-9]\d*$/;
        if(reg.test(value) === false){
          return callback(new Error(rule.invalidMessage));
        }
      }
      callback();
    }, 200);
  }
};

/**
 * 扩展DATE属性,增加日期格式化方法
 * @param f
 * @returns {*}
 */
Date.prototype.format = function(f){
  let o ={
    "M+" : this.getMonth()+1, //month
    "d+" : this.getDate(),    //day
    "H+" : this.getHours(),   //hour
    "m+" : this.getMinutes(), //minute
    "s+" : this.getSeconds(), //second
    "q+" : Math.floor((this.getMonth()+3)/3),  //quarter
    "S" : this.getMilliseconds() //millisecond
  };
  if(/(y+)/.test(f))f=f.replace(RegExp.$1,(this.getFullYear()+"").substr(4 - RegExp.$1.length));
  for(let k in o)
    if(new RegExp("("+ k +")").test(f))f = f.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));return f
};

export default
{Util:Util}