Javascript过滤器与映射问题

Javascript过滤器与映射问题,javascript,map,filter,Javascript,Map,Filter,作为我的最小/最大值在一系列对象上的延续,我想知道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"]; })); m

作为我的最小/最大值在一系列对象上的延续,我想知道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版本返回正确的结果。但是,
过滤器
ed版本返回NaN。打破它,单步执行并最终检查结果,看起来内部函数返回
\u vec
x
属性,但从
过滤器
返回的实际数组是未过滤的
\u vec

我相信我使用的
过滤器是正确的-其他人能看到我的问题吗

下面是一个简单的测试:

<!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>

S:GTC地图测试
函数向量(x,y,z){this.x=x;this.y=y;this.z=z;}
var-vec=[];
向量推(新向量(1,1,1));
向量推(新向量(2,2,2));
向量推(新向量(2,3,3));
var_vec=vec;
min_x=Math.min.apply(Math,vec.filter(函数(el){returnel[“x”];}));
min_y=Math.min.apply(Math,_vec.map(函数(el){returnel[“x”];}));
文件。写入(“
过滤器=“+min\u x”); 文件。写入(“
map=“+min\y”);
否,
过滤器
方法不会返回未完成的数组。它返回一个数组,其中包含内部函数返回true的项

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

filter
方法与
map
方法的作用不同。
map
方法用于转换数组中的每个项,而
filter
方法用于选择数组中的某些项。比较两种方法的性能是没有意义的,因为它们中只有一种方法能满足您的要求。

引自:

JavaScript:权威指南
大卫·弗拉纳根

map()

map()
调用指定的函数,并返回包含
该函数返回的值

例如:

a = [1, 2, 3];

b = a.map(function(x) { return x*x; });  // b is [1, 4, 9]
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]
传递给map()的函数的调用方式与 传递给forEach()的函数。但是,对于map()方法 传递的函数应该返回一个值 数组:它不修改调用它的数组。如果该数组是 稀疏,返回的数组将以相同的方式稀疏:它将 具有相同的长度和相同的缺失元素

过滤器()

该方法返回一个数组,其中包含 在其上调用它的数组。传递给它的函数应该是 谓词:返回true或false的函数。谓词是 与forEach()和map()一样调用。如果返回值为true, 或转换为true的值,然后元素传递给 谓词是子集的成员,并被添加到 将成为返回值

示例:

a = [1, 2, 3];

b = a.map(function(x) { return x*x; });  // b is [1, 4, 9]
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]
a=[5,4,3,2,1];
smallvalues=a.filter(函数(x){return x<3});//[2, 1]
everyother=a.filter(函数(x,i){返回i%2==0});//[5, 3, 1]

啊。看来我误解了过滤函数的工作原理。我的印象是它向数组返回了一个修改过的对象。不,map和filter都返回新数组。