楊__羊羊
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的項,所以會漏掉一些本應該刪掉的項。
不知道我說明白了嗎

翻過高山走不出你
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
提交
取消