Array.prototype.filter
返回通过提供的谓词的元素,因此在您的情况下,这将是对于其为真的item
。要实现您想要的效果,您需要首先过滤项目,然后使用map
提取第二个元素:
var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']];
var result = array.filter(function(item) {
return item[0] == 8;
}).map(function (item) {
return item[1];
});
console.log(result);
或者使用 reduce:
var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']];
var result = array.reduce(function(result, item) {
return item[0] == 8 ? result.concat(item[1]) : result;
}, []);
console.log(result);
如果你想使用ES6的功能,它可以变得更短:
const array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']];
const result1 = array.filter(([item]) => (item == 8)).map(([,item]) => item);
const result2 = array.reduce((res, [n, str]) => n == 8 ? [...res, str] : res, []);
console.log(result1);
console.log(result2);
编辑:要理解为什么您的函数无法正常工作,您需要了解 Array.prototype.filter()
的工作原理。它创建一个新数组,由提供的谓词函数(即检查某些条件并返回布尔值)返回 true 的元素组成。对于所有子数组,第一个元素为 8
,第二个元素将决定是否使用该元素来创建新数组。
因此,对于 array
的每个元素(首先是[8,'first']
,然后是[8,'second']
等),将评估您的函数,并将为其返回 true 的元素添加到新数组中:
[[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']]
true, true, false, true, false
=> [[8, 'first'], [1, 'empty'], [8, 'third']]
filter
的文档。根据您的过滤函数的返回值,它将保留或不保留当前元素。它不会修改它或使用您返回的对象。 - sjahan