有个100长度的数组recieDetailList,我想删除里面的空项,这样写为什么不对? recieDetailList.forEach((item,index)=>{ if(!item.medicine){ console.log("kong") recieDetailList.splice(index,1) console.log(recieDetailList) } })删完发现只有50条,为何没删除干净
3 回答
慕妹3242003
TA贡献1824条经验 获得超6个赞
首先说为什么,就是数组的实际下标和forEach回调函数中的index发生了错位
举个例子,arr=[0,0,0,1,0,1],删除掉其中所有为0的项,
如果代码写为:
arr.forEach((item, index) => {
if(item === 0)
arr.splice(index, 1)
})
那么返回的结果为arr=[0, 1, 1]
具体的原因是:
index=0,arr=[0,0,0,1,0,1],删掉第0项,arr=[0,0,1,0,1];
index=1,arr=[0,0,1,0,1],删掉第1项,arr=[0,1,0,1],从这一步就能看出来index=1的原义是删掉原数组[0,0,0,1,0,1]中的下标为1的0,但是由于原数组已经被删掉了第一个0,所以此时数组下标为1的项是原数组中下标为2的项,所以会漏掉一些本应该删掉的项。
不知道我说明白了吗
翻过高山走不出你
TA贡献1875条经验 获得超3个赞
recieDetailList=recieDetailList.filter((item,index)=>{
return !item.medicine })
慕容708150
TA贡献1831条经验 获得超4个赞
没对的原因是splice在删除的同时,也改变了数组自身的长度。你下一个的index会往前跳一个,所以没删完。
你可以试着,倒序的遍历
即:
for(i=arr.length;i>0;i--) 这样
添加回答
举报
0/150
提交
取消
