早安stackoverflow ... 我遇到了问题....这是我的示例代码
var i:Number = new Number();
trace("showarray length" + showArray.length);
for(i=0;i<showArray.length;i++){
trace("equal daw" + showArray.getItemAt(i).id + "==" + num);
if(showArray.getItemAt(i).id == num){
showArray.removeItemAt(i);
}
}
trace('alerts');
myproblem这里是...无论何时if都满足它停止循环它立即退出循环
这是一个示例输出 鉴于showArray的长度为2且num = 0
showarray length2
等于daw0 == 0
警报
请帮帮我
答案 0 :(得分:8)
如果要在迭代数组时删除项目,请按相反顺序迭代。这样,元素移除不会影响循环条件:
for (var i:int = showArray.length - 1; i >= 0; i--) {
if (someCondition) {
showArray.removeItemAt(i);
}
}
另一个小小的奖励,它稍快一点,因为它不会在每一步调用showArray.length。
答案 1 :(得分:3)
更好的方法可能是使用filter
类的Array
方法。
array = array.filter(function (e:*, i:int, a:Array):Boolean {
return e.id != num;
});
答案 2 :(得分:1)
如果if
对id == num
感到满意(在第一个循环中为0)并且项目被删除,则数组长度减少到1,因此循环将不再运行
答案 3 :(得分:1)
那是因为你在迭代时删除了项目。
array = [1, 2]
^ // pointer in first iteration
eliminate 1
array = [2]
^ // the pointer remains in the same location
//ups! out of the loop. all items were visited.
您可以在迭代数组之前复制数组并迭代副本或标记索引以便稍后删除和删除它们或向后迭代数组。
PS:抱歉我的英语不好。
答案 4 :(得分:1)
在showArray.removeItemAt(i);
之后,添加i--;
由于您从数组中删除了索引i
处的项目,因此i + 1
处的项目已移至i
。通过减去一个,可以确保不会跳过移动的项目。
alxx的答案也是一个很好的解决方案。