删除数组中的重复项

问题描述 投票:1回答:4

Delete duplicates in an array

  1. 其中一个函数使用JS ES6的本机方法
  2. 有更好的方法(兼容性和性能)吗?

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

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

谢谢

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);
javascript arrays performance optimization benchmarking
4个回答
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>

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);

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;
  }, []);
}

0
投票

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

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

如果你想过滤掉undefined,你最好在减少到唯一值之后这样做,所以你在Set中只有一个undefined,并且可以很容易地删除:

var set = new Set(arr);
set.delete(undefined);
return Array.from(set);
© www.soinside.com 2019 - 2024. All rights reserved.