繁体   English   中英

Javascript过滤器与地图问题

[英]Javascript filter vs map problem

作为对一系列对象的最小值/最大值的延续,我想知道过滤器与地图的性能比较。

所以我对代码中的值进行了测试,以查看 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。 打破它,逐步完成并最终检查结果,看起来内部函数返回_vecx属性, _vec 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的项。

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

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

引自:

JavaScript:权威指南
作者:David Flanagan

地图()

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

例如:

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

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

过滤()

该方法返回一个数组,该数组包含调用它的数组元素的子集。 传递给它的函数应该是谓词:返回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] 
// MAP creates a new array
// MPA return new Array
var arr = [1, 2, 3, 4, 5, 6, 7];

var newArr = arr.map((el) => {
  return el * 2;
});

console.log(newArr); //2,4,3,8,10,12,14

// filter() return new Array
var newFilter = arr.filter((el) => {
   return el * 2;
});
console.log(newFilter); // 1,2,3,4,5,6,7

现在你可以看到我为mapfilterreturn el*2他们给出了不同的输出

Filter() filter() 方法创建一个新数组,其中填充了通过函数实现的测试的所有数组元素。

如果此条件返回 true,则元素将被推送到输出数组。 如果条件返回 false,则元素不会被推送到输出数组。

var arr = [1, 2, 3, 4, 5, 6, 7];
var newFilter = arr.filter((el) => {
  return el > 3;
});
console.log(newFilter);  //[1, 2, 3, 4]

Map() map() 方法用于从现有数组创建一个新数组,对第一个数组的每个元素应用一个函数 var arr = [1, 2, 3, 4, 5, 6, 7 ];

var newArr = arr.map((el) => {
  return el * 2;
});

console.log(newArr); //2,4,3,8,10,12,14

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM