js对数组去重的方法,数组中可能包括数字,字符串,对象(兼容顺序错乱),方法

uniqueObjects(arr){
  const seen = new Set();
  const symbolMap = new Map();
  let symbolId = 0;

  const getKey = (element) => {
    if (element === null) {
      return 'null';
    }

    const type = typeof element;
    switch (type) {
      case 'undefined':
        return 'undefined';
      case 'boolean':
        return `boolean:${element}`;
      case 'number':
        return `number:${element}`;
      case 'string':
        return `string:${element}`;
      case 'symbol':
        if (!symbolMap.has(element)) {
          symbolMap.set(element, symbolId++);
        }
        return `symbol:${symbolMap.get(element)}`;
      case 'function':
        return `function:${element.toString()}`;
      case 'object':
        if (Array.isArray(element)) {
          const elements = element.map(getKey);
          return `array:[${elements.join(',')}]`;
        } else if (element instanceof Date) {
          return `date:${element.toISOString()}`;
        } else if (element instanceof RegExp) {
          return `regexp:${element.toString()}`;
        } else {
          const keys = Object.keys(element).sort();
          const keyValuePairs = keys.map(key => {
            return `${getKey(key)}:${getKey(element[key])}`;
          });
          return `object:{${keyValuePairs.join(',')}}`;
        }
      default:
        return `${type}:${element}`;
    }
  };

  return arr.filter(item => {
    const key = getKey(item);
    return seen.has(key) ? false : seen.add(key);
  });
},

满足所有目前使用的场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值