var items = ['a', 'd', 'e', 'b', 'c', 'd', 'e', 'f', 'g', 'd', 'f', 'g', 'd', 'j', 'k', 'l', 'd', 'e', 'c', 'd', 'e', 'f', 'g', 'd','c', 'd', 'e', 'f', 'g', 'd'];
如果您必须循环遍历项(可能没有意义,但这是场景要求),那么最快的方法是创建一个新数组并将值存入其中。
选项1:
var list = [];
items.forEach(function(item) {
if(list.indexOf(item) == -1)
list.push(item);
});
选项2:
var list = [];
items.forEach(function(item) {
list.push(item);
});
list = Array.from(new Set(list));
我已经使用 console.time
进行了一些测试,结果显示选项2比选项1快5倍。但我不确定这个console.time
有多可靠。
有什么见解?是indexOf
使选项1变慢吗?
Fiddle: https://jsfiddle.net/q9opqvsm/
编辑:另一个问题:如果选项2更快,我应该将代码从选项1改为选项2吗?如果不是,为什么?
items
并将所有元素都推入到list
中? 为什么不直接使用list = Array.from(new Set(items));
呢? - Matt BurlandindexOf
是O(n)
,这意味着您在循环内部有一个循环,从而使您的总体复杂度为O(n2)
。在选项2中,在集合中查找值是O(1)
,而Array.from
是O(n)
,因此您的总体复杂度为O(n)
。 - Matt Burland