2012-12-19 91 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檢查,如果不是相同的數字是重複的。爲使項目唯一(*),索引和索引位置必須匹配。