使用 vanilla JS 删除 ES5 及更低版本数组中重复数字的最快方法是啥?

Posted

技术标签:

【中文标题】使用 vanilla JS 删除 ES5 及更低版本数组中重复数字的最快方法是啥?【英文标题】:What is the fastest way to remove duplicate numbers in an array for ES5 and below with vanilla JS?使用 vanilla JS 删除 ES5 及更低版本数组中重复数字的最快方法是什么? 【发布时间】:2016-10-19 04:49:06 【问题描述】:

正如标题所说,我只对 ES5 之前的香草 JS 感兴趣。并且要排序的数组 (a) 仅包含非负整数 (0,1,2,3...)。顺序也无所谓。

我不确定 filter、reduce 或 for 循环是否更快:

1) 过滤器

uniqueArray = a.filter(function(item, pos) 
    return a.indexOf(item) == pos;
)

2) 减少

var unique = a.reduce(function(reduceArray,currentValue)
    if (reduceArray.indexOf(currentValue) < 0 ) reduceArray.push(currentValue);
    return reduceArray;
  ,[]);

3) 为

var hash   = [],
    unique = [];
for (var i= 0, len = a.length; i<len; i++) 
   if (!hash[a[i]]) 
      unique.push(a[i]);
   
   hash[a[i]] = true; 

我认为 for 循环的性能最好。我的推理:

    for 循环在 O(n) 中运行 JS 中的函数调用很昂贵。 filter 和 reduce 正在调用一个函数。 for 循环没有

我的推理可以吗?有没有更有效的方法来删除重复项?

【问题讨论】:

Which is faster? “性能对你正在使用的硬件等因素非常敏感” 元素的顺序对你来说重要吗? 你的问题是indexOf的使用。这会导致性能不佳,因为对于每个项目,都必须在数组中搜索索引。 您无法真正将前两个与第三个进行比较。前两个可以使用任意值,至少可以以相同的方式进行比较。而第三个选项要求该值是 stringify-able. 【参考方案1】:

我相信就是这样;

var myArray = [100, 200, 100, 200, 100, 100, 200, 200, 200, 200],
    unified = Object.keys(myArray.reduce(function(p,c) p[c] = true; return p;,));
console.log(unified);

【讨论】:

但是reduce正在调用一个函数。【参考方案2】:

事实证明lodash.uniq() 比使用new Set() 更快

https://www.measurethat.net/Benchmarks/Show/3889/0/lodash-uniq-vs-set

您可以分叉测试并添加自己的测试用例。

【讨论】:

以上是关于使用 vanilla JS 删除 ES5 及更低版本数组中重复数字的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

“iframe.contentDocument”在 IE8 和 FF(3.5 及更低版本)中不起作用还有其他解决此问题的步骤吗?

Android 4.4 及更低版本上的 SSLHandshakeException

UIRefreshControl 有条件地为 ios 5 及更低版本声明

scss 使用Breakpoint +指南针/支持处理IE8及更低版本

scss 使用Breakpoint +指南针/支持处理IE8及更低版本

Internet Explorer 8 及更低版本的 SVG 支持