2012-12-19 70 views
4

我想提高我的JavaScript的理解,所以我一直在通过Zepto库寻找。我碰到这条线:Zepto使用array.filter

uniq = function(array){ 
    return array.filter(function(item, idx){ 
     return array.indexOf(item) == idx 
    }) 
} 

这个功能的目的是什么?据我所知,它正在创造一种新的,独特的元素阵列,对吗?但是,它不是基本上只是克隆阵列吗?如果是这样,array.slice()会不会更快?

最后,是不是会提高性能,将array.indexOf(item)更改为array.indexOf(item,idx)?或者更好的,只是return truearray.indexOf(item)==idx是不是等于true?这是为了防止重复项目?但是什么时候会真的发生?

+1

我觉得'indexOf'的整个使用是不必要的。为什么他们不能“回归真实”;每次呢?我认为你是对的,但它使得克隆 – Ian

+1

@Ian:这就是我想知道的。什么时候'array.indexOf(item)== idx'不等于'true'? – cegfault

+1

哈哈,只要你编辑和提到“这是为了防止重复的项目?”,我意识到它在做什么......以及其他几个谁发布:) – Ian

回答

3

it is creating a new, unique array of elements, right?

它只是过滤您的数组元素返回独特的元素。

demo

But isn't it essentially just cloning the array?

没有如我上面解释。

If so, wouldn't array.slice() be faster?

切片并不删除重复。

Finally, wouldn't it increase performance to change array.indexOf(item) to array.indexOf(item,idx)? Or better yet, just return true?

如果你只返回true如果元素复制或不是你将无法识别。

demo

When does array.indexOf(item)==idx not equal true?

实施例:
我有以下的数组:

['10', '20', '30', '20', '10']

迭代

  • 1:array.IndexOf(10) == 0? //是的,所以返回true
  • 2:array.IndexOf(20) == 1? //是的,所以返回true
  • 3:array.IndexOf(30) == 2? //是的,所以返回true
  • 4:array.IndexOf(20) == 3? //没有,因为array.indexOf(20)是1,所以返回false
  • 5:array.IndexOf(10) == 4? //没有因为array.indexOf(10)是2,所以返回false

所以,当元素已经被发现,因为索引是不一样的它变得虚假。

0

函数(与named相同)在原始数组中使用唯一项,并将它们返回到新数组中。所以如果原始数组有不同的项目,它只会返回一个克隆。

请记住,indexOf返回给定项目的第一个索引。因此,如果当前项在数组中出现两次,则过滤器值将为false。

For example.

var a = [1, 2, 3]; 
var b = [1, 2, 3, 2]; 

console.log(uniq(a)); // [1,2,3] 
console.log(uniq(b)); // [1,2,3] 

1

啊我看 “差” 我们质疑。在你的编辑中,你可以回答它。我认为这种方法返回一个新的数组,其中包含来自原始数据的唯一值。

indexOf方法扫描数组时,它会查找当前检查项目的第一个匹配项。如果该事件与正在检查的当前索引不相同,则indexOf结果将不等于idx。因此,它不会返回值,因为它没有找到,或者它在数组的前面找到(这意味着它是重复的)。

下面是一个例子:

[10, 30, 10, 100] 

filter方法经过项目:103010,然后100,它将在它执行indexOf。对于10indexOf将返回0。而idx也是0

对于30indexOf将返回1。而idx也是1。对于10indexOf将返回0。但idx将是2

对于100indexOf将返回3。而idx也是3

因此,[10, 30, 100]将被返回,而不仅仅是原始的简单克隆。

+0

我给了里卡多一个答案,因为他是最彻底的,但是感谢所有的帮助! – cegfault

+0

哦,当然,我会同意这是谁应该得到它,他也首先回答...没有问题 – Ian

0

正如其他人所说,这已经摆脱了数组中的重复。只是添加我的答案,以显示为什么这个工程。如果注销过滤函数内的值,你会看到这个模式:

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 * 
*/ 

检查的最后一列,这是什么决定,如果该项目已经存在,所以对第二列的比较array.indexOf(item) == idx检查,如果不是相同的数字是重复的。为使项目唯一(*),索引和索引位置必须匹配。