for迴圈陣列時使用splice時應注意的問題
const list = [ {"className": "花花5555", "gradeName": "畢業班"}, {"className": "中ei班", "gradeName": "畢業班"}, {"className": "花花班5", "gradeName": "小班"}, {"className": "花花", "gradeName": "大班"}, {"className": "花花班", "gradeName": "中班"}, {"className": "蘋果班", "gradeName": "大班"}, {"className": "呃呃呃", "gradeName": "中班"}, {"className": "中二班", "gradeName": "畢業班"}, {"className": "大一班", "gradeName": "大班"}, {"className": "大一班1", "gradeName": "畢業班"}, {"className": "中一班", "gradeName": "畢業班"} ]
for (let i = 0; i < list.length; i++) { if (list[i].gradeName === '畢業班') { list.splice(i, 1) } }
console.log(JSON.stringify(list))
列印結果:[{"className":"中ei班","gradeName":"畢業班"},
{"className":"花花班5","gradeName":"小班"},
{"className":"花花","gradeName":"大班"},
{"className":"花花班","gradeName":"中班"},
{"className":"蘋果班","gradeName":"大班"},
{"className":"呃呃呃","gradeName":"中班"},
{"className":"大一班","gradeName":"大班"},
{"className":"中一班","gradeName":"畢業班"}
]
發現gradeName為‘畢業班’的元素還有,這是為什麼呢?
通過分析陣列知道了:for迴圈依次進行,每次都在加1,即時陣列改變,也是加1,
當i為0時,發現gradename為‘畢業班’,於是刪除,陣列改變了,
繼續i為1時,實際上,是刪除後新陣列的第二個元素,也就是原陣列的第三個元素,通過這可以發現,跳過了原陣列的第二個元素,導致沒有被迴圈出來,被遺忘了!
解決方案:
for (let i = 0; i < list.length; i++) { if (list[i].gradeName === '畢業班') { list.splice(i, 1) i = i - 1 //滿足條件時不要跳過下一個元素 } }
console.log(JSON.stringify(list))
列印結果:
[{"className":"花花班5","gradeName":"小班"},{"className":"花花","gradeName":"大班"},{"className":"花花班","gradeName":"中班"},{"className":"蘋果班","gradeName":"大班"},{"className":"呃呃呃","gradeName":"中班"},{"className":"大一班","gradeName":"大班"}]
gradeName為‘畢業班’的都被過濾掉了!
讓splice小坑了一下!、、、