Zepto使用array.filter

时间:2012-12-19 05:18:11

标签: javascript

我正在努力提高我对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)会不会提高效果?或者更好,只是return truearray.indexOf(item)==idx 何时为真?这是为了防止重复的项目?但什么时候会发生呢?

5 个答案:

答案 0 :(得分: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

因此,当已经找到元素时,它会变为false,因为索引不相同。

答案 1 :(得分:1)

这段代码似乎正在消除重复。

答案 2 :(得分:1)

啊,我看到我们正在质疑的“差异”。你有点回答,在你的编辑中。我认为这个方法返回一个新数组,其中包含原始的唯一值。

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

以下是一个例子:

[10, 30, 10, 100]

filter方法遍历项目时:103010,然后100,它将执行indexOf在它上面。

对于10indexOf将返回0idx也是0

对于30indexOf将返回1idx也是1

对于10indexOf将返回0。但idx将为2

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

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

答案 3 :(得分:0)

该函数(如命名)获取原始数组中的唯一项,并以新数组的形式返回它们。因此,如果原始数组具有不同的项,它将只返回一个克隆。

请记住,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]

答案 4 :(得分: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检查第二列,如果它不是相同的数字则重复。要使项目唯一(*),索引和索引位置必须匹配。