3

我有以下代码:

var a = [{a: 1}, {a: 2}, {a: 3}];
a.map(function (item, index) {
  console.log('call');
  if (index < 1) {
    a.splice(index, 1);
  }
});

但是 call 只打印了两次,我希望打印三次。我知道这splice搞砸了数组,但是这种行为有一些解决方法吗?

谢谢!

4

3 回答 3

5

如果您想在迭代时修改数组,那么通常最好使用普通的旧for循环,因为您可以控制迭代并纠正您的修改。

如果您的修改只是删除当前元素,那么向后for循环是最简单的,因为您在删除当前元素时无需进行任何更正。这是一个例子:

var x = [{a: 1}, {a: 2}, {a: 3}];
for (var i = x.length - 1; i >= 0; i--) {
    if (x[i].a === 2) {
        // remove current element
        x.splice(i, 1);
    }
}

如果您不介意创建一个新数组作为迭代的结果,您可以使用其他方法,例如.filter().

于 2014-04-30T23:03:59.447 回答
4

制作数组的浅拷贝:

a.slice().map(function (item, index) {

顺便说一句,您可能应该使用,forEach因为您没有返回任何值。

或者更好的是,您是否考虑过filter改用?

var a = [{a: 1}, {a: 2}, {a: 3}].filter(function (item, index) {
  console.log('call');
  return index >= 1;
});
于 2014-04-30T22:52:14.050 回答
4

map 中的回调有第三个参数,它是它自己的数组

var a = [{a: 1}, {a: 2}, {a: 3}];
a.map(function (item, index, a2) {
  console.log('call');
  if (index < 1) {
    a2.splice(index, 1);
  }
});

如果来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

map 处理的元素范围是在第一次调用回调之前设置的。在调用 map 开始后附加到数组的元素将不会被回调访问。如果数组的现有元素被更改或删除,它们传递给回调的值将是 map 访问它们时的值;被删除的元素不会被访问。

于 2015-03-19T16:05:31.177 回答