JavaScript 数组过滤器未按预期工作

4

我觉得这样是正确的,但它并不起作用:

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]

这将如何工作,并如何使用地图完成相同的工作?

1
你在哪里使用 i - Rayon
1个回答

12

Array#filter遍历数组,你不需要在filter内部使用for

filter内部使用for的问题在于它会返回元素的索引,如果未找到则可以是-1(truthy),并且任何长度的数组都可以。只有对于第一个元素即索引为零,filter才不会添加该元素,因为JavaScript中的零是falsey。

此外,for循环仅检查bar的第一个元素,并从那里return

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>');


2
同意答案。回答关于过滤器和映射的问题,如果函数的返回值为true,则过滤器仅返回那些元素。映射返回相同数量的元素,对于false值的返回,返回的元素将是未定义的。还有一件事,映射返回一个新数组。过滤器不返回新数组。 - Will
@Tushar能否为我提供一个地图示例,以展示相同的结果? - elkebirmed
1
如果使用 map 而不是 filter,则需要在 map 之后使用 filter 来删除空洞 演示 @elkebirmed - Tushar
ES6:arr.filter(e => !bar.includes(e)) - Tushar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接