Javascript Zepto&x27;s使用array.filter
我试图提高我对Javascript的理解,所以我一直在浏览Zepto库。我遇到了这样一条线:Javascript Zepto&x27;s使用array.filter,javascript,Javascript,我试图提高我对Javascript的理解,所以我一直在浏览Zepto库。我遇到了这样一条线: uniq = function(array){ return array.filter(function(item, idx){ return array.indexOf(item) == idx }) } 这个功能的目的是什么?据我所知,它正在创建一个新的、独特的元素数组,对吗?但它本质上不只是克隆阵列吗?如果是这样的话,array.slice() 最后,将array
uniq = function(array){
return array.filter(function(item, idx){
return array.indexOf(item) == idx
})
}
这个功能的目的是什么?据我所知,它正在创建一个新的、独特的元素数组,对吗?但它本质上不只是克隆阵列吗?如果是这样的话,array.slice()
最后,将
array.indexOf(item)
更改为array.indexOf(item,idx)
是否会提高性能?或者更好的是,只需返回true
?什么时候array.indexOf(item)==idx
不等于true?这是为了防止重复项目吗?但是什么时候会真正发生这种情况呢?这段代码似乎在消除重复项。函数(命名)获取原始数组中的唯一项,并在新数组中返回它们。因此,如果原始数组有不同的项,它将只返回一个克隆
记住,indexOf
返回给定项的第一个索引。因此,如果当前项在数组中出现两次,则筛选值将为false
啊,我看到了我们所质疑的“区别”。不过,在你的编辑中,你回答了这个问题。我认为该方法返回一个新数组,其中包含原始数组中的唯一值
当indexOf
方法扫描数组时,它会找到当前检查项目的第一个匹配项。如果该事件与正在检查的当前索引不同,则indexOf
结果将不等于idx
。因此,它不会返回该值,因为它要么未找到,要么在数组中较早地找到(这意味着它是重复的)
下面是一个例子:
[10, 30, 10, 100]
当过滤器
方法通过以下项目时:10
,30
,10
,然后100
,它将对其执行索引
对于10
,indexOf
将返回0
。而idx
也是0
对于30
,indexOf
将返回1
。而idx
也是1
对于10
,indexOf
将返回0
。但是idx
将是2
对于100
,indexOf
将返回3
。而idx
也是3
因此,将返回[10,30,100]
,而不仅仅是原始元素的简单克隆。它正在创建一个新的、唯一的元素数组,对吗?
它只是过滤数组元素以返回唯一的元素
但它本质上不只是克隆阵列吗?
不,正如我上面解释的
如果是这样,array.slice()不是会更快吗?
切片不会删除重复项
最后,将array.indexOf(item)更改为array.indexOf(item,idx)是否会提高性能?或者最好是返回true?
如果只返回true,则不会标识元素是否重复
array.indexOf(item)==idx何时不等于true?
示例:
我有以下数组:
['10','20','30','20','10']
迭代次数:
- 1:
数组。IndexOf(10)==0
?//是的,所以返回true
- 2:
数组。IndexOf(20)==1
?//是的,所以返回true
- 3:
数组。IndexOf(30)==2
?//是的,所以返回true
- 4:
数组。IndexOf(20)==3
?//否,因为array.indexOf(20)
是1,所以返回false
- 5:
数组。IndexOf(10)==4
?//否,因为array.indexOf(10)
是2,所以返回false
因此,当元素已经被找到时,它将变为false,因为索引不同。正如其他人所说的,这将消除数组中的重复项。刚才添加了我的答案,以说明为什么这是有效的。如果您注销filter函数中的值,您将看到以下模式:
array.filter(function( item, idx ){
console.log( item, idx, array.indexOf( item ) );
...
...
console.log( uniq( ['a','a','b','b','c','c','c','d'] ) );
/*
a 0 0 *
a 1 0
b 2 2 *
b 3 2
c 4 4 *
c 5 4
c 6 4
d 7 7 *
*/
检查最后一列,这是确定该项是否已存在的原因,因此比较数组。indexOf(item)==idx
检查第二列,如果它不是相同的数字,则它是重复的。要使项目唯一(*
),索引和索引位置必须匹配。我觉得没有必要全部使用索引。为什么他们不返回true代码>每次?不过我认为你是对的,这是一个好消息clone@Ian:这就是我想知道的。什么时候willarray.indexOf(item)==idx
不等于true
?哈哈,当你编辑并提到“这是为了防止重复的项目吗?”时,我意识到了它在做什么……其他一些人也发了帖子:)@Ian:是的。。。这是否意味着我应该因为回答自己的问题而获得荣誉?萝莉:从技术上来说,我想,但这并不好:)我给了里卡多答案,因为他是最彻底的,但谢谢你的帮助!哦,当然,我同意谁应该得到它,他也先回答了…没问题
array.filter(function( item, idx ){
console.log( item, idx, array.indexOf( item ) );
...
...
console.log( uniq( ['a','a','b','b','c','c','c','d'] ) );
/*
a 0 0 *
a 1 0
b 2 2 *
b 3 2
c 4 4 *
c 5 4
c 6 4
d 7 7 *
*/