AS3:使用for循环一次性删除数组中的所有元素

5

编辑:下面每个回答都有效,感谢你的帮助!

我目前在学习as3中的数组拼接。 这是我的代码:

//import classes
import flash.utils.Timer;
import flash.events.*;

//variables
var Arr:Array=new Array();
var num:Number=0;
//set a timer and set timer limit of 10 times
var timer:Timer=new Timer(1000,10);

//add a listener to our timer object
timer.addEventListener(TimerEvent.TIMER, tick);
timer.addEventListener(TimerEvent.TIMER_COMPLETE,tock);

//tick function
function tick(e:TimerEvent):void{
    //i add an element each time the timer 'ticks'
    Arr.push(['index'+num]);
    num++;
}
//tock function
function tock(e:TimerEvent):void{
trace('array elements :'+Arr);//traces Arr elemnts
for(var i:int=0;i<Arr.length;i++){
    Arr.splice(i,1);// i've tried Arr.splice(0,1), but neither working
    trace('elemnts left : '+Arr);
}

我不是很理解问题,但这是结果:

1.并没有移除Arr数组中的每个元素。 2.在切割之前,Arr数组最大长度为十。然而,在循环中,只切割了少于十次,这导致了上述问题。

有人对此有想法吗? 请帮帮我。


2
你的for循环正在查看Arr.length,这个值在每次循环迭代时都会改变。第一次迭代时,它检查i(当前为0)是否小于10。然后你删除一个项目并将i增加到1。在下一次迭代中,它检查i(现在为1)是否小于9。你明白我的意思了吗? - user2655904
不太确定我理解了。但是我明白重点。 - Yudhis
谢谢你的解释,兄弟!这让我更清楚地看到正在发生的事情。 - Yudhis
3个回答

6

有更简单、更快速的选项:

你可以只将数组长度设置为0。这将立即有效地删除其所有元素。

Arr.length = 0;

您可以创建一个新的空Array类实例。它不会立即销毁原始对象,但如果没有对其的引用,它最终将被垃圾收集器消耗,因此您无需考虑它。
// You can omit () with the "new" operator if there are no mandatory arguments.
Arr = new Array;

非常感谢,我会尝试的! - Yudhis
给我时间到明天。因为我现在必须注销。 - Yudhis
数组字面量常量array:Array = []被认为是惯用的,也更快。 - Florian Salihovic
2
@FlorianSalihovic 不是的。 [...] 记录明显更短。然后,我只是测试了一百万次和一千万次循环,坦率地说,在经过的时间上没有太大的区别,两种方法在大约50ms的范围内结束比赛。不排除在某些时候确实存在差异,但是在最近的SDK /播放器版本中没有差异。 - Organis
@Organis - 感谢您指出这一点。我总是会参考https://sourceforge.net/adobe/flexsdk/wiki/Coding%20Conventions/#array-literals。 - Florian Salihovic
@FlorianSalihovic 有一种脚本风格确实很好,但不要认为你的风格是最好的。我看了你的链接,有些情况我觉得还可以,有些情况则...一般般。不好的地方在于它们强制性地命令这样做,不要那样做。我主张可读性和易于理解的脚本,以及直接的架构,但有时候没有时间,有时候一个丑陋的解决方案比重构几个类更小更容易,因此我会妥协如何做事情。然后我总是检查自己到底哪种方法更快。 - Organis

4
for(var i:int=0;i<Arr.length;i++)

这就是为什么它不会切割掉所有的东西。每次循环时,由于你已经进行了切割,Arr.length会减少1,因此一旦到达i==5(第六次循环),条件将得到满足,因为“i”(5)不再小于Arr.length(数组中还剩5个),因此循环停止。
你的条件应该是只要数组项数大于0就进行切割。请尝试使用以下代码片段:
for(var i:int=0;Arr.length>0;i++)

另外,splice的使用方法如下:Arr.splice(索引, 要删除的数量)。在这种情况下,您可以在索引0处进行切割,从底部逐个删除它们。因此,正确的编写方式是:

Arr.splice(0,1)

如果你的目标只是清空数组,只需执行以下操作:
Arr.length = 0;

顺便提一下,在推送新数组时,您不需要放置那些方括号。

Arr.push('index '+num);

同样有效。


非常感谢!这些方法正是我想要的。现在我知道了真正的问题所在。谢谢大家! - Yudhis
非常感谢!这些方法正是我想要的。现在我知道了真正的问题所在。谢谢大家! - Yudhis

1
你可以这样写。它将删除整个元素。
 function tock(e:TimerEvent):void{ 

     var i = Arr.length
    while (i--) {
        ...
        if (...) { 
            Arr.splice(i, 1);
        } 
    }    
}

否则您只需重新初始化该数组(Arr)。

给我时间到明天。因为我现在必须注销。 - Yudhis
1
不,删除不会像那样起作用。你只能使用它从数组中删除属性,而不能清空它。 - kaarto
1
如果你的数组长度是5,在 delete 操作后它仍然是5。它可能会清空一些值,但不会清空整个数组。而且他的例子只会导致错误,因为它不能直接应用于数组本身。 - kaarto
1
所以,例如你可以使用 delete Arr[0]; 来清空数组中的第一个属性/值/元素,但是数组的长度仍然保持不变且 Arr[0] 的值将变为未定义。 - kaarto
哦,现在我明白了。非常感谢@kaarto。 - Yudhis
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接