JS中对数组进行去重的几种方法

代码演示:

let arr = [1,1,'true','true',15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 'a', 'a'];

// 方法1,可以对NaN进行去重,因为 Set 加入值时认为NaN等于自身
function f1(arr) {
  // return Array.from(new Set(arr));
  return [...new Set(arr)];
}
console.log('方法1:',f1(arr));

// 方法2,不可以对NaN进行去重(indexOf方法无法识别数组的NaN成员)
function f2(arr) {
  let result = [];
  for (let i = 0; i < arr.length; i++) {
    if (result.indexOf(arr[i]) === -1) {
      result.push(arr[i]);
    }
  }
  return result;
}
console.log('方法2:',f2(arr));

// 方法3,使用ES6的findIndex方法,可以结合Object.is()方法对NaN进行去重
// Object.is()方法认为NaN等于自身
function f3(arr) {
  let result = [];
  for (let i = 0; i < arr.length; i++) {
    if (result.findIndex(value => Object.is(arr[i],value)) === -1) {
      result.push(arr[i]);
    }
  }

  return result;
}
console.log('方法3:',f3(arr));

// 方法4:可以对NaN进行去重
// 数组的includes()方法认为NaN等于自身
function f4(arr) {
  let result = [];
  for (let i = 0; i < arr.length; i++) {
    if (!result.includes(arr[i])) {
      result.push(arr[i]);
    }
  }
  return result;
}
console.log('方法4:',f4(arr));

// 方法5:这种方法会将NaN跳过去,最后的结果中不会包含NaN
// indexOf内部使用严格相等运算符(===)进行判断,这会导致对NaN的误判。
function f5(arr) {
  return arr.filter((value,index) => {
    return arr.indexOf(value) === index;
  });
}
console.log('方法5:',f5(arr));

以上介绍的几种方法大同小异,下边对涉及到NaN的内容进行一个总结:

NaN == NaN // false
NaN === NaN // false

// indexOf方法无法识别数组的NaN成员
[NaN].indexOf(NaN) // -1

// 向 Set 数据结构中加入值时认为NaN等于自身
let set = new Set();
set.add(NaN);
set.add(NaN);
console.log(set); // Set {NaN}

// Object.is()方法认为NaN等于NaN
Object.is(NaN, NaN) // true
+0 === -0 //true
Object.is(+0, -0) // false

// ES2016中新增的数组实例方法:includes()方法认为NaN等于自身
[1, 2, NaN].includes(NaN) // true

前端学习交流QQ群,群内学习讨论的氛围很好,大佬云集,期待您的加入:862748629 点击加入

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值