javascript工具方法

76 阅读2分钟

最近工作整理的一些工具方法,分享出来

1. 数字分隔格式化处理

function addCount(formatArr, count, limit, split) {
  if (count >= limit) return formatArr;
  formatArr.splice(count, 0, " ");

  addCount(formatArr, count + split, formatArr.length, split);
}

/** 数字分隔格式化处理
 *  str 数字串 例如 888888888888, 411322199007898787
 *  splitNum 分隔数 例如4
 *  firstSplitNum  首次分隔数(用于身份证) 6
 *  返回  8888 8888 8888,411322 1990 0789 8787
 */
export function numFormat(str, splitNum, firstSplitNum?) {
  let formatStr = String(str);
  formatStr = formatStr.replace(/ /g, "");
  const formatArr = formatStr.split("");
  if (firstSplitNum) {
    let count = firstSplitNum;
    splitNum = splitNum + 1;
    addCount(formatArr, count, formatArr.length, splitNum);
  } else {
    addCount(formatArr, splitNum, formatArr.length, splitNum + 1);
  }
  const resultStr = formatArr.toString();
  return resultStr.replace(/,/g, "");
}

2.删除obg属性

/** 删除obg属性
 * obg 对象  {name: '', sex: ''}
 * keys  属性数组 ['name', 'sex']
 */
export function delObgKey(obg, keys) {
  if (keys && Array.isArray(keys)) {
    for (let i = 0; i < keys.length; i++) {
      if (
        obg &&
        typeof obg === "object" &&
        Object.prototype.hasOwnProperty.call(obg, keys[i])
      ) {
        try {
          delete obg[keys[i]];
        } catch (err) {
          console.log("delete error");
        }
      }
    }
  }
  return obg;
}

3. 给金额添加逗号

/*
 * 给金额添加逗号
 * money:金额,字符串
 */
export const convertMoney = (money: string | number) => {
  money = money.toString();
  if (!money) {
    return "--";
  }
  return amountFormat(money.replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,"));
};

4. 多层取值

/** 多层取值 getValueFromRoot(fundDetail, 'fundDetail.fundStatus.duration'); */
export const getValueFromRoot = (root, valueStr) => {
  if (!(root && valueStr)) return "";
  console.log("valueStr=======", valueStr);
  if (valueStr.includes(".") >= 0) {
    const valueArr = valueStr.split(".");
    let resultValue = root;
    for (let i = 1; i < valueArr.length; i++) {
      if (checkNullData(resultValue[valueArr[i]])) {
        resultValue = resultValue[valueArr[i]];
      } else {
        resultValue = "";
      }
    }
    return resultValue;
  }
  return root;
};

6. 掩码

/**
 * 掩码
 * @param str 文本
 * @param frontLen 前面保留位数
 * @param endLen 后面保留位数
 * @param isReverse 是否取反
 */
export const maskCodeHasReverse = (
  str: string,
  frontLen: number = 0,
  endLen: number = 0,
  isReverse: boolean = false
) => {
  if (!str) {
    return "";
  }
  const len = str.length - frontLen - endLen;
  if (len <= 0) {
    return str;
  }
  let symbol = "";
  for (let i = 0; i < len; i++) {
    symbol += "*";
  }
  if (isReverse) {
    let symbolLeft = "";
    let symbolRight = "";
    for (let i = 0; i < frontLen; i++) {
      symbolLeft += "*";
    }
    for (let i = 0; i < endLen; i++) {
      symbolRight += "*";
    }
    return (
      symbolLeft + str.substring(frontLen, str.length - endLen) + symbolRight
    );
  }
  return (
    str.substring(0, frontLen) + symbol + str.substring(str.length - endLen)
  );
};

7. 截取小数点位数,无四舍五入

export const checkNullData = (value) => {
  return !(value === null || value === undefined || value === "");
};

/** 截取小数点位数,无四舍五入, 判断值是否为null undefind '' */
export function formatDecimalcheckNull(num, decimal = 2) {
  if (!checkNullData(num)) return num || 0;
  num = num.toString();
  let index = num.indexOf(".");
  if (index !== -1) {
    num = num.substring(0, decimal + index + 1);
  } else {
    num = num.substring(0);
  }
  return parseFloat(num).toFixed(decimal);
}

8. 数据字段替换

/**
 *  数据转换,
 *  @params transForm [{oldField: 'lastGains', newField: 'rate'}, {oldField: '$riskLevel.name', newField: 'riskLevel'},]
 *  @params dataArr  [{lastGains: '18', riskLavel:{ name: '中高风险'}}, { lastGains: '16',riskLavel:{ name: '低风险'} }]
 *  return data [{rate: '18', riskLavel: '中高风险'},{rate: '16', riskLavel: '低风险'}]
 * 如果oldFeild 取值包含$,隔层取值,替换newField的值
 */
export const transData = (transForm, dataArr) => {
  try {
    for (let i = 0; i < transForm.length; i++) {
      let transValue = "";
      if (dataArr && Array.isArray(dataArr) && dataArr.length > 0) {
        dataArr = dataArr.map((it, idx) => {
          if (transForm[i].oldField.indexOf("$") >= 0) {
            let newStrArr =
              transForm[i].oldField.replace("$", "").split(".") || [];
            transValue = getLengthData(it, newStrArr, newStrArr.length - 1, 0);
          } else {
            transValue =
              it && getValueFromRoot(it, `it.${transForm[i].oldField}`);
          }

          it[transForm[i].newField] = transValue;
          return it;
        });
      }
    }
    return dataArr;
  } catch (err) {
    console.log("err");
    return [];
  }
};

9. 日期格式化

/** 日期格式化 */
export const dateFormat = (
  dateFrom: number | string,
  format = "yyyy-MM-dd hh:mm:ss"
) => {
  if (dateFrom === 0 || dateFrom === "") {
    return "";
  }
  if (Object.prototype.toString.call(dateFrom) === "[object String]") {
    dateFrom = dateFrom.toString().replace(/-/g, "/");
  }
  const date = new Date(dateFrom);
  const o = {
    "M+": date.getMonth() + 1, // 月份
    "d+": date.getDate(), // 日
    "h+": date.getHours(), // 小时
    "m+": date.getMinutes(), // 分
    "s+": date.getSeconds(), // 秒
    "q+": Math.floor((date.getMonth() + 3) / 3), // 季度
    S: date.getMilliseconds(), // 毫秒
  };
  if (/(y+)/.test(format)) {
    format = format.replace(
      RegExp.$1,
      `${date.getFullYear()}`.substr(4 - RegExp.$1.length)
    );
  }
  Object.keys(o).forEach((k) => {
    if (new RegExp(`(${k})`).test(format)) {
      format = format.replace(
        RegExp.$1,
        RegExp.$1.length === 1 ? o[k] : `00${o[k]}`.substr(`${o[k]}`.length)
      );
    }
  });
  return format;
};

10. url参数,对象转&

// url参数,对象转&
export const connectParams = (params, symbol = "&") => {
  return Object.entries(params)
    .filter((param) => param[1] !== "" && param[1] !== undefined)
    .map((param) => `${param[0]}=${param[1]}`)
    .join(symbol);
};
              11. 比较两个日期大小
                /** 比较两个日期大小
 * startDate 2020-11-11
 * endDate 2021-11-11
 * type qe > re <
 */
export const checkDate = (startDate, endDate, type) => {
  let status = false;
  if (startDate.includes("-") && endDate.includes("-")) {
    let sDate = startDate.split("-");
    let eDate = endDate.split("-");
    for (let i = 0; i < sDate.length; i++) {
      if (type === "qe") {
        if (Number(sDate[i]) > Number(eDate[i])) {
          status = true;
          break;
        }
        if (Number(sDate[i]) < Number(eDate[i])) {
          status = false;
          break;
        }
      } else if (type === "re") {
        if (Number(sDate[i]) < Number(eDate[i])) {
          status = true;
          break;
        }
        if (Number(sDate[i]) > Number(eDate[i])) {
          status = false;
          break;
        }
      }
    }
  }
  return status;
};

12 添加全局className

/** 添加全局className */
export const addClassNameToBody = (className) => {
  const oBody = document.body;
  const classnameArr = [oBody.className];
  if (className && !classnameArr.includes(className)) {
    classnameArr.push(className);
  }
  document.body.className = classnameArr.filter((item) => item).join(' ');
};

/** 删除全局className */
export const removeClassNameToBody = (className) => {
  const oBody = document.body;
  const classnameArr = (oBody.className && oBody.className.split(' ')) || [];
  if (className) {
    const _index = classnameArr.indexOf(className);
    if (_index >= 0) {
      classnameArr.splice(_index, 1);
    }
    // console.log('classnameArr  _index', className,  classnameArr, _index);
  }
  document.body.className = classnameArr.filter((item) => item).join(' ');
};

13. 去除对象里的空属性

export const checkNullData = (value) => {
  return !(value === null || value === undefined || value === '');
};

/** 去除对象里的空属性 */
export function resetObjectNullProperty(obj) {
  if (!(obj !== undefined && JSON.stringify(obj) !== '{}')) return obj;
  let keys = Object.keys(obj);
  let values = Object.values(obj);
  let newObj = obj;
  try {
    for (let i = 0; i < keys.length; i++) {
      if (!checkNullData(values[i])) {
        newObj = delObgKey(obj, [keys[i]]);
      }
    }
  } catch (err) {
    console.log('resetObjectNullProperty err', err);
    return obj;
  }

  return newObj;
}

14. 判断两个对象是否相等

/** 判断两个对象是否相等 */
export const isObjectValueEqual = (a, b) => {
  var aProps = Object.getOwnPropertyNames(a);
  var bProps = Object.getOwnPropertyNames(b);
  if (aProps.length != bProps.length) {
    return false;
  }
  for (var i = 0; i < aProps.length; i++) {
    var propName = aProps[i];

    var propA = a[propName];
    var propB = b[propName];
    // 故先判断两边都有相同键名
    if (!b.hasOwnProperty(propName)) return false;
    if (propA instanceof Object) {
      if (isObjectValueEqual(propA, propB)) {
        // return true
      } else {
        return false;
      }
    } else if (propA !== propB) {
      return false;
    } else {
    }
  }
  return true;
};

15. 合并对象

 export const assiginObj = (target = {}, sources = {}) => {
  let obj = target;
  if (typeof target != 'object' || typeof sources != 'object') {
    return sources; // 如果其中一个不是对象 就返回sources
  }
  for (let key in sources) {
    // 如果target也存在 那就再次合并
    if (target.hasOwnProperty(key)) {
      obj[key] = assiginObj(target[key], sources[key]);
    } else {
      // 不存在就直接添加
      obj[key] = sources[key];
    }
  }
  return obj;
};