Javascript过滤器vs地图问题

时间:2010-03-14 16:22:37

标签: javascript map filter

作为对象数组中min / max的延续,我想知道滤镜与地图的性能比较。

所以我对代码中的值进行了测试,以便查看FireBug中的结果。

这是代码:

var _vec = this.vec;
min_x = Math.min.apply(Math, _vec.filter(function(el){ return el["x"]; }));
min_y = Math.min.apply(Math, _vec.map(function(el){ return el["x"]; }));

map ped版本返回正确的结果。但是filter版本返回NaN。打破它,逐步检查并最终检查结果,似乎内部函数返回x的{​​{1}}属性,但从_vec返回的实际数组是未经过滤的{{1} }}

我相信我对filter的使用是正确的 - 其他人是否可以看到我的问题?

这是一个简单的测试:

_vec

2 个答案:

答案 0 :(得分:47)

不,filter方法不返回未经过滤的数组。它返回一个数组,其中包含内部函数返回true的项。

由于您没有从内部函数返回布尔值,因此该值将转换为布尔值,因此对象引用将转换为true。因此,它返回一个包含原始数组中所有项的新数组。

filter方法与map方法的作用不同。 map方法用于转换数组的每个项目,而filter方法用于选择数组的某些项目。比较这些方法之间的表现是没有意义的,因为只有其中一个方法可以做你想做的事。

答案 1 :(得分:13)

引自:

JavaScript:权威指南
作者:David Flanagan

  

<强>地图()

     

map()方法传递数组的每个元素   调用您指定的函数,并返回一个包含的数组   该函数返回的值。

     

例如:

a = [1, 2, 3];

b = a.map(function(x) { return x*x; });  // b is [1, 4, 9]
     

传递给map()的函数的调用方式与a相同   函数传递给forEach()。但是,对于map()方法,   你传递的函数应该返回一个值。注意map()返回一个新的   array:它不会修改它调用的数组。如果那个数组是   稀疏,返回的数组将以相同的方式稀疏:它会   具有相同的长度和相同的缺失元素。

     

过滤器()

     

该方法返回一个包含元素子集的数组   调用它的数组。你传递给它的功能应该是   谓词:返回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]