数组中删除元素
最开始的想法是调用数组的forEach()方法,根据条件找到的index索引删除该项
问题:
当删除一个元素时,不会发生意外,就可以这样操作,但是当删除数组中多个元素时,这样就会出错了,会出现有些项删不了的情况(还有可能报错)
原因:
我们的需求是将状态为status = 0 的项删除掉:
- 思路一:那就forEach()遍历数组,找到对应的索引进行删除
let lists = [
{ id: 1,name: "Tom", status: 0 },
{ id: 2,name: "Jack", status: 0 },
{ id: 3,name: "Any", status: 1 },
{ id: 4,name: "Lucy", status: 1 },
{ id: 5,name: "John", status: 0 }
];
lists.forEach((item,index) => {
if(item.status === 0) {
lists.splice(index,1);
}
})
console.log(lists);
这样显然不行,因为每当删除一项,数组对应索引的值就会改变
结果如下:
过程:
当index=0
,时 进入删除,然后进入下一次遍历
index=1
,而此时index=1 的项是{ id: 3,name: "Any", status: 1 }
那么也就是说,每当我们有需要删除的项挨在一起时,那么删除项的下一项会被忽略遍历,因为数组本身索引对应的内容改变了。
原因:这是在对本身数组做操作
- 思路二:我想,那我就对index做一做操作吧
然后就出现了下面的代码
lists.forEach((item,index) => {
if(item.status === 0) {
lists.splice(index,1);
index --;
}
})
想法是:希望每删除一项,就让索引回到删除项,重新遍历
结果是: 还是和之前一样,并没有什么用(发现了好像平时我们不怎么注意的一件事,forEach方法的index我们操作是无效的)
- 思路三:那么我们就回到原始人吧,用for循环
那么就出现了以下代码:
for(let i=0;i<lists.length;i++) {
if(lists[i].status === 0) {
lists.splice(i,1);
i--;
}
}
然后结果就对了。
小结:虽然这是一个小问题,也算是for循环数组和forEach()方法的不同之处了。码住。以后不犯这样的错了