删除索引时,JavaScript forEach无法完全迭代索引

时间:2019-02-03 19:08:33

标签: javascript

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

在数组上运行时,我删除了第一个索引,并且仅迭代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
  }
});

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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