删除数组中的重复项

时间:2019-02-18 08:40:31

标签: javascript arrays performance optimization benchmarking

删除数组中的重复项

  1. 函数之一使用JS ES6的本机方法
  2. 是否有更好的方法(兼容性和性能)?

注意:过滤数组中未定义的元素

英语薄弱,可能被描述为不准确。 >﹏<< / p>

谢谢

function delRepeatArray1(arr) {
    console.time();
    var result = Array.from(new Set(arr));
    console.timeEnd();

    return result;
}

function delRepeatArray2(arr) {
    console.time();
    var result = arr.filter(function (em, index, arr) {
        return arr.indexOf(em) === index;
    });
    console.timeEnd();

    return result;
}

var arr = ["undefined", "200", 0, -0, 200, undefined, undefined, null, true, null, "true", false, 0, true, 200, false],
    result1 = delRepeatArray1(arr),
    result2 = delRepeatArray2(arr);

console.log(result1);
console.log(result2);

4 个答案:

答案 0 :(得分:0)

这里有一个简短的代码片段,可以从提供的数组中获得独特的价值:

var arr = ["undefined", "200", 0, -0, 200, undefined, undefined, null, true, null, "true", false, 0, true, 200, false];
var uniqueNames = [];
$.each(arr, function(i, el){
    if($.inArray(el, uniqueNames) === -1) uniqueNames.push(el);
});
console.log(uniqueNames);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

答案 1 :(得分:0)

我发现了一个benchmark,它为此比较了几种方法。在我的系统上,最快的方法是简单循环。

function unique(arr) {
  let out = [];
  const len = arr.length;
  for (let i = 0; i != len; ++i) {
    const obj = arr[i];
    if (out.indexOf(obj) == -1) out.push(obj);
  }
  return out;
}

尽管,该基准测试表明,在其他系统上使用reduce的速度更快。

function unique(arr) {
  return arr.reduce((out, obj) => {
    if (out.indexOf(obj) == -1) out.push(obj);
    return out;
  }, []);
}

答案 2 :(得分:0)

我们不能简单地将其设为一组?

var arr = ["undefined", "200", 0, -0, 200, undefined, undefined, null, true, null, "true", false, 0, true, 200, false];
var filteredarr = arr.filter(Boolean); //filter undefined
var set = new Set(filteredarr); //remove duplicates
console.log(set);

答案 3 :(得分:0)

最快的方法是使用Set过滤出重复项。 在小型阵列上没有任何区别,要对代码进行基准测试,应尝试使用较大的阵列(例如,至少65k个元素)。然后,您会看到常规循环(您的delRepeatArray2)与Set相比要慢得多,而undefined基本上可以与较小的项目组保持相同的时间。

说,我们还在谈论几毫秒。

如果要过滤出undefined,最好在之后进行处理,直到将值减小为唯一值,这样集合中就只有一个var set = new Set(arr); set.delete(undefined); return Array.from(set); ,并且可以轻松删除:

{{1}}