记数组splice的小坑

let arr =  [
  {name: '', age: 0}
  {name: '', age: 1},
  {name: '', age: 2},
  {name: '', age: 3},
 ]
for(let i = 0; i < arr.length; i++ ){
  if(arr[i].name == ''){
    arr.splice(i, 1);
   }
 }
 console.log(arr);

期待的结果是 arr是空数组,然后此时的结果却是

 [
  {name: '', age: 1},
  {name: '', age: 3}
 ]

其实原因很简单,因为splice是直接操作并修改数组的,for循环到下标0,发现name是空,删除后,去循环下标为1的数据,而此时age为1的item的下标已经变成了0,所以跳过了,以此类推,最后打印出来的数组自然就有2条数据了。
解决办法是从后往前循环

for(let i = arr.length - 1; i > -1; i--){
  if(arr[i].name == ''){
    arr.splice(i, 1);
  }
}

这样就出来正确的结果了
当然了,在这个案例里用数组的filter方法才是正确的打开方式

arr = arr.filter(el => {
  return el.name != '';
})
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容