1. 程式人生 > >for迴圈陣列時使用splice時應注意的問題

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小坑了一下!、、、