需求:遍历一个节点下的所有子节点,然后一个个删除。
实现:按照习惯会这样写
var children = this.node.children;
for(let i=0;i<children.length;i++){
children.splice(i,1);
}
问题:每次splice都会改变children的长度,但是i却不是每次从0开始而是上一轮循环结果开始的,所以导致某些位置无法删除
比如有一个数组[0,1,2,3,4,5];
for(let i=0;i<arr.length;i++){
arr.splice(i,1);
}
第一轮循环:剩余[1,2,3,4,5],删除了位置0 i=1, length = 5
第二轮循环 剩余[1,3,4,5],删除了位置1(上一轮循环结果的i值),i = 2, length = 4
第三轮循环 剩余[1,3,5],删除了位置2 ,i= 3,length = 3
第四轮:此时i == arr.length,最终结果arr = [1,3,5]
由此可见,数组不能完全删除。
解决方案:每次从数组的最后一位开始删除,这样不管前面的如何删除数组如何变化,都一定会删除数组的最后一位,直到i遍历到数组0的位置。
for(let i=arr.length-1;i>=0;i++){
arr.splice(i,1);
}