# 基础知识

# 遍历对象

for (const key of Object.keys(obj)) {
  console.log(obj[key]);
}

# filter 过滤

var arr = [1, 2, "", 3, " "];
var arr2 = arr.filter(function(item) {
  return item;
}); //[1,2,3,' ']

# 本地特定的顺序排序数组

arr.sort((a, b) => {
  return a.localeCompare(b);
});

# 去除对象 null 或者 undefined 的属性

const { omitBy, isNil } = require("lodash");
omitBy({ name, email, role }, isNil);

# es6求交集、并集、差集

let a=new Set([1,2,3]);
let b=new Set([2,3,4]);
//并集
let union=new Set([...a,...b]);
console.log(union);
//交集
let intersect=new Set([...a].filter(x=>b.has(x)));
console.log(intersect);
//差集
let diff=new Set([...a].filter(x=>!b.has(x)));

# 数组扁平化、去重、排序

已知如下数组:var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; 编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

var arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
// 扁平化
let flatArr = arr.flat(4);
// 去重
let disArr = Array.from(new Set(flatArr));
// 排序
let result = disArr.sort(function(a, b) {
  return a - b;
});
console.log(result);
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

# 判断函数是否有

if (callback && typeof callback === "function") {
  callback();
}

# dayjs 选时间

// 开始时间
// 今天开始从现在开始,后面的从零点开始
export function getStartTime(time) {
  if (
    dayjs(dayjs().format("YYYY-MM-DD")).isSame(dayjs(time).format("YYYY-MM-DD"))
  ) {
    return dayjs(time).valueOf();
  } else {
    return dayjs(dayjs(time).format("YYYY-MM-DD")).valueOf();
  }
}
// 从今天的零点开始
export function getStartTime(time) {
  return dayjs(dayjs(time).format("YYYY-MM-DD")).valueOf();
}
// 结束时间
export function getEndTime(time) {
  return dayjs(dayjs(time).format("YYYY-MM-DD"))
    .add(1, "day")
    .add(-1, "millisecond")
    .valueOf();
}

# 数字格式化

/*
 * 参数说明:
 * number:要格式化的数字
 * decimals:保留几位小数
 * dec_point:小数点符号
 * thousands_sep:千分位符号
 * roundtag:舍入参数,默认 'ceil' 向上取,'floor'向下取,'round' 四舍五入
 * */
function numberFormat(
  number,
  decimals = 6,
  dec = ".",
  sep = "",
  roundtag = "round"
) {
  number = (number + "").replace(/[^0-9+-Ee.]/g, "");
  const n = !isFinite(+number) ? 0 : +number;
  let x = String(number).indexOf(".") + 1;
  let decIndex = x !== 0 ? String(number).length - x : 0; //小数的位数
  decimals = decIndex < decimals ? decIndex : decimals;
  const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals);
  let s = [];
  const toFixedFix = function(n, prec) {
    const k = Math.pow(10, prec);
    return (
      "" +
      parseFloat(
        Math[roundtag](parseFloat((n * k).toFixed(prec * 2))).toFixed(prec * 2)
      ) /
        k
    );
  };
  s = (prec ? toFixedFix(n, prec) : "" + Math.round(n)).split(".");
  const re = /(-?\d+)(\d{3})/;
  if (sep !== "") {
    while (re.test(s[0])) {
      s[0] = s[0].replace(re, "$1" + sep + "$2");
    }
  }
  if ((s[1] || "").length < prec) {
    s[1] = s[1] || "";
    s[1] += new Array(prec - s[1].length + 1).join("0");
  }
  return s.join(dec);
}

console.log(numberFormat(1200031.10001001));

# 16进制转rgba

/**
 * 16 进制颜色转 rgba
 * @param color 16 进制颜色
 * @param transparency 透明度 0~1
 */
export default (color: string, transparency = 0.8) => {
  const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/
  let sColor = color.toLowerCase()

  // 如果是16进制颜色
  if (sColor && reg.test(sColor)) {
    if (sColor.length === 4) {
      var sColorNew = '#'
      for (var i = 1; i < 4; i += 1) {
        sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))
      }
      sColor = sColorNew
    }
    //处理六位的颜色值
    var sColorChange = []
    for (var i = 1; i < 7; i += 2) {
      // eslint-disable-next-line radix
      sColorChange.push(parseInt('0x' + sColor.slice(i, i + 2)))
    }

    return `rgba(${sColorChange.join(',')},${transparency})`
  }

  return sColor
}

# 中间显示省略号

export const showXing = (
  str: string,
  frontLen: number,
  endLen: number,
  xingNumber?: number,
) => {
  let len = str.length - frontLen - endLen;
  let xing = '';
  for (let i = 0; i < (xingNumber ? xingNumber : len); i++) {
    xing += '*';
  }
  return str.substring(0, frontLen) + xing + str.substring(str.length - endLen);
};

# 格式化百分比

/**
 * 格式化百分比
 * @param val 输入小数
 * @param noUnit 没有
 * @returns 格式化的百分比
 */
export const percentageTextFormat = (
  val,
  params: { hasUnit?: boolean; maximumFractionDigits?: number; hasDigits?: boolean } = {
    hasUnit: true,
    maximumFractionDigits: 2,
    hasDigits: false,
  },
) => {
  const { hasUnit = true, maximumFractionDigits = 2, hasDigits = false } = params
  const valStr = val ? (val * 100).toFixed(maximumFractionDigits) : 0
  return (hasDigits ? valStr : Number(valStr) * 1) + (hasUnit ? '%' : '')
}

# 格式化数字


/**
 * 格式化数字
 * @param val 输入数字
 * @param maximumFractionDigits 小数点后几位
 * @returns 格式化的数字
 */
export const numberFormat = (val, maximumFractionDigits = 2, useGrouping = true) => {
  if (!val) {
    return 0
  }
  let res = val
  if (typeof val !== 'number') {
    res = Number(val)
  }
  res = res?.toLocaleString('zh', { maximumFractionDigits, useGrouping: false })
  res = Number(res)
  res = res?.toLocaleString('zh', { useGrouping })
  return res
}

# 金额缩写


/**
 * 金额缩写
 * @param val 输入数字
 * @returns 格式化的数字
 */
export const abbrNumberFormat = (val, maximumFractionDigits = 2, useGrouping = true) => {
  if (!val) {
    return {
      num: 0,
      abbrStr: '',
      toString: () => {
        return ''
      },
    }
  }
  let res = val
  let abbr = ''
  if (typeof val !== 'number') {
    res = Number(val)
  }
  if (res > 100000000) {
    res = res / 100000000
    abbr = '亿'
  } else {
    if (res > 10000) {
      res = res / 10000
      abbr = '万'
    }
  }
  res = res?.toLocaleString('zh', { maximumFractionDigits, useGrouping: false })
  res = Number(res)
  res = res?.toLocaleString('zh', { useGrouping })
  return {
    num: res,
    abbrStr: abbr,
    valueOf: function () {
      return this.num + this.abbrStr
    },
    toString: function () {
      return this.num + this.abbrStr
    },
  }
}
lastUpdate: 11/29/2021, 1:23:51 AM