亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

數組刪除迭代

數組刪除迭代

楊__羊羊 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 關注
  • 468 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號