JavaScript数组去重

62 阅读1分钟

indexOf()方法

indexOf()方法使用全等(===)判断,因此结果含有两个NaN

let arr1 = [1, 2, 3];
let arr2 = arr1;
let arr = [1,1,22,22,'ab','ab',true,true,false,false,null,null,undefined,undefined];
// 创建一个空数组,存储去重后的数组
let newArr = [];
// 1--> for循环 + indexOf() +push()
 for (let i = 0; i < arr5.length; i++) {
     if (newArr.indexOf(arr5[i]) === -1) {
        newArr.push(arr5[i]);
      }  
}
//结果:[1, 22, 'ab', '', Array(3), true, false, null, undefined, NaN, NaN] 无法去除NaN

// 1-1 --> 逻辑与优化
 for (let i = 0; i < arr5.length; i++) {
       newArr.indexOf(arr5[i]) === -1 && newArr.push(arr5[i]);
}
//结果:[1, 22, 'ab', '', Array(3), true, false, null, undefined, NaN, NaN]无法去除NaN
// 2--> forEach() + indexOf() +push()
arr.forEach(function (item, index, arr) {
            newArr.indexOf(item) === -1 && newArr.push(item);
});
//结果: [1, 22, 'ab', '', Array(3), true, false, null, undefined, NaN, NaN]

reduce()

includes() 使用 零值相等算法

let res = arr.reduce((preValue, currentValue) => {
        !preValue.includes(currentValue) && preValue.push(currentValue);
        //
        return preValue;
      }, []);
      console.log(res); 
//结果:[1, 22, 'ab', '', Array(3), true, false, null, undefined, NaN]

filter

虽然使用了includes,但filter遍历了所有元素

 let res = newArr.filter((item) => {
        return !newArr.includes(arr);
      });
// 结果: [1, 22, 'ab', '', Array(3), true, false, null, undefined, NaN, NaN]

Set集合

利用Set元素唯一的特点

let res = [...new Set(arr)]
//结果:[1, 22, 'ab', '', Array(3), true, false, null, undefined, NaN]

(文章不断更新中...)