我正在通過JavaScript:權威指南作爲Learn JavaScript Properly的一部分,而我在第7章數組方法部分的filter()
方法中遇到了問題。JavaScript filter()方法混淆
這裏所提供的例子:
的
filter()
方法返回包含在其上調用它的陣列的 元件的子集的陣列。您傳遞給 的函數應該是謂詞:返回true或false的函數。與forEach()
和map()
一樣, 謂詞也被調用。如果返回值 值爲true,或者值爲true,則傳遞給謂詞的元素 是該子集的成員,並被添加到將成爲返回值的 數組中。例子:
a = [5, 4, 3, 2, 1];
smallvalues = a.filter(function(x) { return x < 3 }); // [2, 1]
everyother = a.filter(function(x,i) { return i%2==0 }); // [5, 3, 1]
當我越來越糊塗是i
是如何準確地在該everyother
線適用於x
。這是我認爲正在發生的事情:
i
(的a[]
指數)正在通過功能,x
,其謂語適用於a[]
每個元素,並返回[4, 2]
通過。然後功能說「過濾
[4, 2]
出a[]
」...我真的很模糊如何。
當我亂七八糟的控制檯的時候,我已經試過:
everyother = a.filter(function(i) { return i%2==0 }); // returns [4, 2]
這正是我所期望的,但我不明白在JS如何處理參數時內部發生更改上面的代碼
everyother = a.filter(function(x,i) { return i%2==0 }); // returns [5, 3, 1]
(我知道陣列方法應用於像這樣:function(element, index, array)
)
對於這個特殊的例子,很明顯,我認爲我能得到預期的結果的另一種方式:
everyother = a.filter(function(x) { return x%2!=0 }); // returns [5, 3, 1]
但我懷疑這種思維路線恰恰缺少的例子是試圖傳達出點......我只是想念它。
在JavaScript中,參數始終是可選的。過濾器回調的簽名是'fn(element,index,arr)'第一個例子'i'指向元素,在第二個例子中它指向索引。您只是在第二個示例中獲取索引均勻的元素。 – 2014-08-30 18:08:09
我認爲這個例子只是試圖解釋一下,你可以使用數組中的值本身和它的索引作爲謂詞。不清楚什麼不清楚。 – Bergi 2014-08-30 18:12:35