Javascript Zepto&x27;s使用array.filter

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

我试图提高我对Javascript的理解,所以我一直在浏览Zepto库。我遇到了这样一条线:

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:这就是我想知道的。什么时候will
array.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 *
*/