【问题标题】:JavaScript Array.filter not working as expectedJavaScript Array.filter 未按预期工作
【发布时间】:2016-03-28 07:31:27
【问题描述】:

这对我来说似乎是正确的,但它不起作用:

var arr = [1, 2, 3, 4, 5];

var bar = [2, 4];

arr = arr.filter(function(v) {
  for (var i; i < bar.length; i++) {
    return bar.indexOf(v);
  }
});

console.log(arr); // []

// expected: [1, 3, 5]

这将如何工作,以及如何对地图进行同样的工作?

【问题讨论】:

  • 你在哪里使用i

标签: javascript arrays dictionary filter


【解决方案1】:

Array#filter 遍历数组,你不需要 forfilter

forfilter 中的问题在于它会返回元素的索引,如果没有找到它可能是-1(truthy) 并且长度不超过大批。并且仅对于第一个元素,即索引零,filter 不会添加该元素,因为零在 JavaScript 中是错误的。

另外,for 循环只会检查barreturn 的第一个元素是否从那里开始。

var arr = [1, 2, 3, 4, 5];
var bar = [2, 4];

arr = arr.filter(function(v) {
  return bar.indexOf(v) === -1;
});

console.log(arr);
document.write('<pre>' + JSON.stringify(arr, 0, 4) + '</pre>');

您不需要Array#mapmap 将在保持相同数量的元素的情况下转换数组元素。


ES6:

从 ES6 开始,您可以使用 Array#includes 和箭头函数让您的代码看起来更干净:

let arr = [1, 2, 3, 4, 5];
let bar = [2, 4];

arr = arr.filter(v => !bar.includes(v));

console.log(arr);
document.write('<pre>' + JSON.stringify(arr, 0, 4) + '</pre>');

【讨论】:

  • 同意答案。为了回答过滤器和映射的问题,如果函数中的返回值为真,过滤器只返回那些元素。 Map 返回相同数量的元素,对于返回 false 值,返回的元素将是未定义的。还有一件事,地图返回一个新数组。过滤器不返回新数组。
  • @Tushar 你能给我同样结果的地图示例吗,只是为了展示?
  • 如果使用map而不是filter,则需要在map后使用filter去洞Demo@elkebirmed
  • ES6: arr.filter(e =&gt; !bar.includes(e))
猜你喜欢
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多