作为我对对象数组的最小值/最大值的延续,我想知道 filter 与 map 的性能比较。
所以我在我的代码中对值进行了测试,以便在 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
ed 版本返回 NaN。将其分解、单步执行并最终检查结果,似乎内部函数返回 _vec
的 x
属性,但实际返回的数组是 filter
是未过滤的 _vec
。
我相信我对 filter
的使用是正确的 - 其他人能看到我的问题吗?
这是一个简单的测试:
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>S:GTC Map Test</title>
</head>
<body>
<script type="text/javascript">
function vector(x,y,z) { this.x = x; this.y =y; this.z=z; }
var vec = [];
vec.push(new vector(1,1,1));
vec.push(new vector(2,2,2));
vec.push(new vector(2,3,3));
var _vec = 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"]; }));
document.write("<br>filter = " + min_x);
document.write("<br>map = " + min_y);
</script>
</body>
</html>
最佳答案
不,filter
方法不返回未过滤的数组。它返回一个数组,其中包含内部函数返回 true 的项。
由于您没有从内部函数返回 bool 值,因此该值被转换为 bool 值,因此对象引用被转换为 true。因此,它返回一个新数组,其中包含原始数组中的所有项。
filter
方法与map
方法的作用不同。 map
方法用于转换数组的每一项,而 filter
方法用于选择数组的某些项。比较这些方法之间的性能没有实际意义,因为只有其中一个方法可以完成您想要做的事情。
关于Javascript过滤器与 map 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2442798/