Javascript 从数组中过滤值

新手上路,请多包涵

我有一个数组数组,每个数组都包含两个元素。如何通过过滤第一个元素从数组中返回第二个元素?

例如,我有以下数组,我的函数应该从第一项为 8 的每个子数组返回第二个元素:

 var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']];

预期结果: ['first', 'second', 'third']

这是我到目前为止实现的,但它返回两个元素而不是每个数组中匹配的第二个元素……

 var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']];
var result = array.filter(function(item){
  if(item[0] == 8) {
    return item[1];
  }
});
console.log(result);

原文由 Valip 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 347
2 个回答

您可以根据条件进行过滤,然后只需要映射您想要的部分。

在单个循环中,只能使用 Array#reduce ,因为在这里您可以操作结果集的值。

Array#filter 返回数组的原始项,不做任何更改。

filter() 方法创建一个新数组,其中包含通过提供的函数实现的测试的所有元素。

对于过滤,回调需要返回一个被解释为布尔值的值,这意味着每个真值(如对象、数组或任何非零数字等)都将项目作为结果集。

如果您只想使用内部数组的一部分并且该部分是真实值,则过滤有效,但它不会获取返回值,因为它不是为此而设计的。

 var array = [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']],
    result = array.filter(function(item){
        return item[0] === 8;
    }).
    map(function (a) {
        return a[1];
    });

console.log(result);

原文由 Nina Scholz 发布,翻译遵循 CC BY-SA 3.0 许可协议

Array.prototype.filter 返回传递给定谓词的元素,所以在你的情况下,这将是 item 对于 第 1 项为真。要实现您想要的效果,您需要先过滤项目,然后使用 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);

或者使用减少:

 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'] 等),你的元素将被评估为真到新数组:

 [[8, 'first'], [8, 'second'], [1, 'empty'], [8, 'third'], [9, 'empty']]
true,          true,          false,        true,         false

=> [[8, 'first'], [1, 'empty'], [8, 'third']]

原文由 Andrzej Smyk 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题