JavaScript数组去重方法实现


数组去重是很常见的操作,很多语言的数组有原生去重方法,而JavaScript至今还是没有数组去重的原生方法,一般都需要自行实现。

这个小功能也是面试常考的,要么让给出思路,要么现场直接写代码,甚至要求多种实现方案。

JavaScript数组去重的实现有很多,个人先收集常想到的三个,以后可能还会增加其他方法。

一、用ES 6中Set数据类型的元素唯一性来实现,最简单省事:

function unique(arr) {
    return [...(new Set(arr))];
}

二、遍历数组,利用对象中属性名的唯一性,来记录数组当前项是否已经被添加进新数组中,算法复杂度为O(1):

function unique(arr) {
    let result  = [];
    let obj = {};
    let i = 0;
    const len = arr.length;
    
    while (++i < len) {
        obj[arr[i]] || result.push(arr[i]);
        obj[arr[i]] = true;
    }
    return result;
}

三、应该是大多数人最容易想到的方法,双层遍历数组,内层遍历查看外层遍历过的元素或还未遍历的元素是否和当前元素相同,复杂度为O(2),明显不如上面两种方法优:

function unique(arr) {
    const len = arr.length;
    let result = [];
    loop: for (let i = 0; i < len; i++) {
        for (let j = i + 1; j < len; j++) {
            if (arr[i] === arr[j]) {
                continue loop;
            }
        }
        result.push(arr[i]);
    }
    return result;
}

方法还有很多,这里只是让自己加深一下思路印象。


一片冰心在玉壶