袁来如此的工作笔记
袁来如此的工作笔记
竹杖芒鞋轻胜马,谁怕? 一蓑烟雨任平生。

for循环数组时使用splice时应注意的问题

浏览量:477

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为‘毕业班’的都被过滤掉了!

打赏