作为Learn JavaScript Properly的一部分,我正在学习《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]
我感到困惑的是在
everyother
行中如何将i
应用于x
。这是我认为正在发生的事情:
i
(a[]
的索引)被传递到函数x
,该函数将谓词应用于a[]
的每个元素并返回[4,2]
。然后函数说“从
a[]
中过滤出[4,2]
”...我对此感到非常模糊。
当我在控制台上尝试时,我尝试了:
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]
但我怀疑这种思路恰恰错过了示例试图传达的重点......我只是没有理解它。
fn(element,index,arr)
。第一个例子中,i
指的是元素,而在第二个例子中,它指的是索引。在第二个例子中,您只是获取其索引为偶数的元素。 - Benjamin Gruenbaum