如何在迭代集合时删除项目?

时间:2010-11-23 10:47:08

标签: actionscript-3 loops

我想使用AS“for each”语法循环遍历一组项目。在循环中,我有时需要从我正在迭代的集合中删除一个项目。

使用“for”循环,我会将其编码为(注意“ - ”运算符以将索引移回):

for (var n:int=0; n<ac.length; n++) {
    var s:String = ac.getItemAt(n) as String;
    if (s == 'c')
        ac.removeItemAt(n--);
}

是否也可以使用“for each”构造做类似的事情?

4 个答案:

答案 0 :(得分:3)

在我所知道的所有语言中,foreach要求迭代的集合在迭代时不会改变。

所以,简单的答案是 - 不,你不能。但是你在样本中做的方式还可以。

编辑:您可以做的是创建一个新的项目列表,需要在foreach(itemList)中删除,而不是通过另一个foreach(来自deletedItems)并从中删除itemList中。唯一令人担心的是你不会迭代你正在改变的集合。

答案 1 :(得分:3)

复制arraycollection或您的数据结构。在原件上做reverse for loop 并从复制的结构中删除所需索引处的元素。

输出:您的新数据结构减去您不想保留的元素。

答案 2 :(得分:0)

如果您正在讨论的for each构造允许在迭代期间访问索引,但即便如此,它肯定会适得其反,因为我确信大多数语言都认为该集合不会突然改变它如果您使用for each,则在迭代期间使用“length”或其索引。如果你输入一个索引参数,那么你将回到常规的for结构中,这样整个练习最终都是徒劳的。

答案 3 :(得分:-1)

这可以通过 for ... in 循环实现。迭代不会中断。

var o:Object = { a: 0, b: 1, c:2 };
for (var k:String in o)
{
   delete o[k];
}