js数组去重的方法

let oldArr = new Array();
oldArr = [1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 7, NaN, NaN];

// 1、最简单利用es6新语法set集合
function fnSet(arr) {
  return [...new Set(arr)];
}
console.log("利用set去重:", fnSet(oldArr));
// 注意:可以对NaN,undefined去重,因为都可以储存在Set中

// 2、for循环逐一比较 splice
function fnFor(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1);
        j--; //防止连续2个相同
      }
    }
  }
  return arr;
}
console.log("利用for循环去重:", fnFor(oldArr));
// 注意:无法NaN去重,因为js中NaN!==NaN

// 3、indexOf去重
// 原理:indexOf()方法:返回调用它对象第一次出现指定指的索引,未找到则返回 -1
function fnIndexOF(arr) {
  const newarr = new Array();
  arr.forEach((item) => {
    if (newarr.indexOf(item) === -1) {
      newarr.push(item);
    }
  });
  return newarr;
}
console.log("利用indexOf去重:", fnIndexOF(oldArr));

// 4、数组的includes()方法,和indexOf异曲同工
function fnIncludes(arr) {
  const newarr = new Array();
  arr.forEach((item) => {
    if (newarr.includes(item) === false) {
      newarr.push(item);
    }
  });
  return newarr;
}
console.log("利用fnIncludes去重:", fnIncludes(oldArr));
// 注意:为什么includes能够检测到数组中包含NaN,其涉及到includes底层的实现。在进行判断是否包含某元素时会调用sameValueZero方法进行比较,如果为NaN,则会使用isNaN()进行转化。

// 5、利用Map()
function fnMap(arr) {
  const mymap = new Map();
  const newArr = [];

  arr.forEach((item) => {
    if (!mymap.has(item)) {
      // has()用于判断map是否包为item的属性值
      mymap.set(item, true); // 使用set()将item设置到map中,并设置其属性值为true
      newArr.push(item);
    }
  });

  return newArr;
}
console.log("利用Map去重:", fnMap(oldArr));
// 注意:可以NaN去重,map内判断NaN为相等,其他用===比较

// 6、利用对象,属性名不可以重复
function fnObj(arr) {
  const newArr = [];
  const obj = {};

  arr.forEach((item) => {
    if (!obj[item]) {
      newArr.push(item);
      obj[item] = true;
    }
  });

  return newArr;
}
console.log("利用对象去重:", fnObj(oldArr));

打印结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值