每天搞透一道JS手写题💪「Day2数组去重的N种方法」

446 阅读1分钟

数组去重

利用 ES6 Set 去重

let arr = [1, 2, 3, 4, 4, 3, 2, 1];
let uniqueArr = [...new Set(arr)];
console.log(uniqueArr); // [1, 2, 3, 4]

如无特殊情况(比如老旧项目不兼容 ES6),利用 set 是最简单性能也最好的方案。

为什么说是 N 种方法呢?因为数组的遍历有很多种方法,查找并去除重复值也有很多种方法,套娃起来自然就有了更多的实现方式,所以后面的方法有个印象,熟悉相关的 API,当作拓展知识即可。

利用indexOf去重:

let arr = [1, 2, 3, 4, 4, 3, 2, 1];
let uniqueArr = [];
arr.forEach((item) => {
    if (uniqueArr.indexOf(item) === -1) {
        uniqueArr.push(item);
    }
});
console.log(uniqueArr); // [1, 2, 3, 4]

利用includes:

上一种和这一种存入新数组的方式,都可以用 filter 方法来返回到一个新数组里。

let arr = [1,2 ,3 ,4 ,4 ,3 ,2 ,1];
let uniqueArr = [];
arr.forEach((item) => {
    if (!uniqueArr.includes(item)) {
        uniqueArr.push(item);
    }
});
console.log(uniqueArr); // [1 ,2 ,3 ,4]

利用sort():

let arr = [1, 2, 3, 4, 4, 3, 2, 1];
arr = arr.sort();
let uniqueArr = [arr[0]];
for (let i = 1; i < arr.length; i++) {
    if (arr[i] !== arr[i - 1]) {
        uniqueArr.push(arr[i]);
    }
}
console.log(uniqueArr); // [1, 2, 3, 4]

利用hasOwnProperty

利用 Map 也可。

let arr = [1 ,2 ,3 ,4 ,4 ,3 ,2 ,1];
let obj = {};
let uniqueArr = [];
arr.forEach((item) => {
    if (!obj.hasOwnProperty(item)) {
        uniqueArr.push(item);
        obj[item] = true;
    }
});
console.log(uniqueArr); // [1 ,2 ,3 ,4]

笨蛋之双重循环,然后splice去重:

let arr = [1, 2, 3, 4, 4, 3, 2, 1];
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--;
        }
    }
}
console.log(arr); // [1, 2, 3, 4]