作为对象数组中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
答案 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]