在地图功能中调用拼接

时间:2014-04-30 22:47:38

标签: javascript splice array-splice

我有以下代码:

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

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

谢谢!

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:2)

制作数组的浅表副本:

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

答案 2 :(得分:2)

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处理的元素范围在第一个之前设置   调用回调。之后附加到数组的元素   回调不会访问地图开始调用。如果存在   数组的元素被更改或删除,它们的值被传递   回调将是时间映射访问它们的价值;分子   删除的内容不会被访问。