今日爬坑,代码如下:

let data = [
  {
    name: 'hefeng',
    from: 'china',
  },
  {
    name: 'alice',
    from: 'china',
  },
  {
    name: 'jack',
    from: 'america',
  },
];

data.forEach((item, index) => {
  if (item.from === 'china') {
    data.splice(index, 1);
  }
});

console.log(data);


猜猜输出啥?[ { name: 'jack', from: 'america' } ] ?

正确输入如下:

[ { name: 'alice', from: 'china' }, { name: 'jack', from: 'america' } ]

为什么?

forEach 回调函数 中删除数组中的一项,会导致数组项往前移动,而 index 在下一次就 index++ , 这样就略过了被删除项的后一项,导致出乎意料!

解决方案: for 循环 index--

for (let index = 0; index < data.length; index++) {
  if (data[index].from === 'china') {
    data.splice(index, 1);
    index--
  }
}

或者使用链表