数组去重

May 13, 2018 15:48 · 424 words · 1 minute read

前言

谈起数组去重,对于大家来说再熟悉不过了,今天想罗列下常用数据的去重方法,谈谈自己的拙见。

方法一

首先介绍下大家最熟悉不过的一个,使用 indexOf

function unique(arr) {
    if(!Array.isArray(arr)) {
        return
    }
    var res = [];
    for (var i = 0, len = arr.length; i < len; i++) {
        if (res.indexOf(arr[i]) === -1) {
            res.push(arr[i])
        }
    }
    return res
}

该方法比较简单,通俗易懂。

方法二

使用双层循环实现,由于时间复杂度为O(n^2) 当数组比较长时,比较耗费内存

function unique(arr) {
    if (!Array.isArray(arr)) {
        return
    }
    var res = [];
    for (var i = 0, len = arr.length; i < len; i++) {
        for (var j = 0; resLen = res.length, j < resLen; j++) {
            if (arr[i] === res[j]) {
                break;
            }
        }
        if (j === resLen) {
            res.push(arr[i]);
        }
    }
      return res;
}

方法三

同样是使用indexOf结合数组的filter方法通过检测元素第一次在数组中出现位置和现在的位置是否相等,若不相等则说明是重复元素。

function unique(arr) {
    if (!Array.isArray(arr)) {
        return
    }
    var res = arr.filter(function(item, index, arr) {
        return arr.indexOf(item) === index;
    })
    return res;
}

方法四

ES6中新增了Set 和Map的数据结构

function unique(arr) {
    if (!Array.isArray(arr)) {
        return
    }
    return Array.from(new Set(arr));
}

可简写为:

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

总结

从代码的不断减少,我们可以发现javascript这门语言也在不断改善,越来越高效。我们应该选择最适合我们的场景去使用。(后续新的方法不断更新)

tweet Share