【问题标题】:JavaScript forEach does not fully iterate over indices when remove an index删除索引时,JavaScript forEach 不会完全迭代索引
【发布时间】:2019-02-04 11:28:54
【问题描述】:

我有一个对象数组,我正在对其进行迭代,并尝试从列表中删除特定对象。

在数组上运行时,我删除了第一个索引并仅迭代 2 次而不是 3 次。

const data = [{
  id: 1,
  name: 'test1'
},
{
  id: 2,
  name: 'test2'
},
{
  id: 3,
  name: 'test1'
}]

data.forEach((item: any, index:any) => { 
  if (item.name === 'test1') { 
    data.splice(index, 1); // Remove one record then and it stops early
  }
});

如果在迭代过程中删除任何内容,是否有人帮助我完全迭代?

【问题讨论】:

  • 使用过滤功能。

标签: javascript


【解决方案1】:

您在遍历数组时从数组中删除索引。因此,您正在处理的数组在每次迭代中都会被更改。

由于您已从数组中删除索引 0,因此长度现在为 2,因此它在第二次迭代时停止。

不要使用forEach,而是使用filter(例如,参见Stackblitz),它不会改变原始数组并返回新数组,然后您可以重新分配它。

let data = [{
  id: 1,
  name: 'test1'
},
{
  id: 2,
  name: 'test2'
},
{
  id: 3,
  name: 'test1'
}];

console.log('BEFORE', data); // Original data

data = data.filter((item: any, index: any) => item.name !== 'test1');

console.log('AFTER', data); // Only `test2` remains now

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-27
    • 2015-07-19
    • 2010-12-05
    • 2017-08-20
    • 1970-01-01
    • 2019-07-05
    • 2015-09-03
    • 1970-01-01
    相关资源
    最近更新 更多