js中使用forEach所遇到的坑

记录一下项目中使用forEach时所踩到的坑。

情景:在使用forEach处理数组时,如果动态的往中间添加一条数据,此时只会处理原数组长度所对应的数据,被挤到后面的那条数据不会进行处理。

例如:

const arr = [{ id: 1 }, { id: 2 }]

arr.forEach((item, index, arr) => {
   console.log('index:', index)

   item.name = "王" + item.id
   console.log('arr:', arr)
   if (item.id === 1) {
   arr.splice(index + 1,0, {id: 9})
   }
})

console.log(arr)

//运行结果如下:
// "index": 0
// "arr:" [{ id: 1, name: "王1" }, { id: 2 }]
// "index": 1
// "arr:" [{ id: 1, name: "王1" }, { id: 9, name: "王9" }, { id: 2 }]
// [{ id: 1, name: "王1" }, { id: 9, name: "王9" }, { id: 2 }]

总结:根据打印结果可以看出,forEach执行中数组的长度发生了变化,但是执行时依旧是按照数组原来长度在执行。

解决办法:使用for循环 

const arr = [{ id: 1 }, { id: 2 }];

for (let index = 0; index < arr.length; index++) {
  console.log('index:', index);

  arr[index].name = '王' + arr[index].id;

  if (arr[index].id === 1) {
    arr.splice(index + 1, 0, { id: 9 });
  }
}

console.log("arr:",arr)

// 结果如下:
// "index:" 0
// "index:" 1
// "index:" 2
// "arr:" [{ id: 1, name: "王1" }, { id: 9, name: "王9" }, { id: 2, name: "王2" }]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值