为了账号安全,请及时绑定邮箱和手机立即绑定

数组删除迭代

数组删除迭代

杨__羊羊 2019-03-07 14:15:40
有个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的项,所以会漏掉一些本应该删掉的项。

不知道我说明白了吗


查看完整回答
反对 回复 2019-03-20
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

recieDetailList=recieDetailList.filter((item,index)=>{

          return !item.medicine
      })


查看完整回答
反对 回复 2019-03-20
?
慕容708150

TA贡献1831条经验 获得超4个赞

没对的原因是splice在删除的同时,也改变了数组自身的长度。你下一个的index会往前跳一个,所以没删完。
你可以试着,倒序的遍历
即:
for(i=arr.length;i>0;i--) 这样

查看完整回答
反对 回复 2019-03-20
  • 3 回答
  • 0 关注
  • 476 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号