使用 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及更低版本