JS数组去重——终极版(多维,复杂类型皆可)

当数组包含对象,且对象的key顺序不一致时key的值确一致时,难点就出现了,需要单独对对象类型做处理,代码如下:

(如果数组中不包含对象,可以用其中的部分代码即可)

function unique(arr) {
  // 因对象特别,分出数组中的对象单独去重
  let objArr = arr.filter((item) => {
    return Object.prototype.toString.call(item) === "[object Object]";
  });
  let otherTypeArr = arr.filter((item) => {
    return Object.prototype.toString.call(item) !== "[object Object]";
  });
  // 数组及简单类型处理
  let obj = {};
  otherTypeArr = otherTypeArr.filter((item, index) => {
    let newItem = item + JSON.stringify(item);
    return obj.hasOwnProperty(newItem) ? false : (obj[newItem] = true);
  });
  // 对象类型处理
  if (objArr.length !== 0) {
    // 将数组对象转成数组字符串
    var objToStrArr = [];
    var keyArr = [];
    var key = "";
    var currentObj = {};
    var currentStr = "";
    objArr.forEach(item => {
      // 对象属性排序
      keyArr = [];
      for (key in item) {
        keyArr.push(key);
      }
      keyArr.sort(); // 降序
      currentObj = {};
      keyArr.forEach(ele => {
        currentObj[ele] = item[ele];
      })
      currentStr = JSON.stringify(currentObj);
      // 去除空格及\t空白字符
      currentStr = currentStr.replace(/(\s|[\\t])/g, "");
      objToStrArr.push(currentStr);
    })
    objToStrArr.sort();
    var tmepArr = [];
    // 数组去重
    objToStrArr.forEach((item, i) => {
      if (item !== tmepArr[tmepArr.length - 1]) {
        tmepArr.push(item);
      }
    })
    var resultArr = [];
    // 新数组字符串转成数组对象
    tmepArr.forEach((item) => {
      resultArr.push(JSON.parse(item));
    })
    objArr = resultArr;
  }
  return [...otherTypeArr, ...objArr];
}
let arr = [
  { b: 100, a: 100 },
  { a: 100, b: 100 },
  { a: 100, b: 200 },
  [1, 1, 2],
  [1, 1, 2],
  [2, 1, 1],
  100,
  200,
  100,
];
console.log(unique(arr));

测试结果:

 

有bug欢迎提出

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值