AS3:如何将Vector转换为数组

Dan*_*ick 23 arrays vector actionscript-3

在Actionscript3中将Vector转换为数组的最好方法是什么?

正常的转换语法不起作用:

var myVector:Vector.<Foo> = new Vector();
var myArray:Array = Array(myVector); // calls the top-level function Array()
Run Code Online (Sandbox Code Playgroud)

由于Array函数的存在.上面的结果是一个数组,但它是一个包含原始Vector的单个元素的数组.

这留下了更多的冗长:

var myArray:Array = new Array();
for each (var elem:Foo in myVector) {
    myArray.push(elem);
}
Run Code Online (Sandbox Code Playgroud)

这很好,我猜,虽然有点罗嗦.这是规范的方法吗,还是有一个toArray()函数隐藏在标准库的某个地方?

bac*_*dos 24

你的方法是最快的...如果你认为这是详细的,那么建立一个实用功能...... :)

编辑:

要构建实用程序函数,您可能必须删除类型,如下所示:

function toArray(iterable:*):Array {
     var ret:Array = [];
     for each (var elem:Foo in iterable) ret.push(elem);
     return ret;
}
Run Code Online (Sandbox Code Playgroud)


rze*_*erg 18

有一个名为forEach的函数,它可以使用Vector和Array.基本上它为向量中的每个元素调用一个函数.这是它的工作原理:

var myVector:Vector.<Foo> = new Vector();
var myArray:Array = [];

myVector.forEach(arrayConverter);

function arrayConverter(element:*, index:int, array:Array):void{
    myArray[myArray.length] = element;
}
Run Code Online (Sandbox Code Playgroud)

但我找不到一个只将所有值从Vector移动到数组的函数.另一个解决方案可能是你创建了一个扩展Vector类的类,然后你有了一个名为toArray()的公共函数,然后你就可以在该函数中使用该代码,这样你就不必在每次转换时都编写它.

矢量文档

编辑:今天发现了这个老问题,并认为在这个星期天早上做所有不同方法的基准测试会很有趣.

我使用了一个包含1000000个项目的向量,并为每个循环进行了2次测试.一个使用内置数组函数push,一个使用常规数组操作.

  • 对于循环,不推:520毫秒
  • 对于循环,按:1027 ms
  • Foreach循环,不推:1753毫秒
  • Foreach循环,推送:2264毫秒
  • 循环时,不推:2775毫秒
  • 循环时,不推:3282毫秒
  • Util循环,不推:4059 ms
  • Util循环,推动:4570 ms

这是一个使用1000个项目的基准:

  • 对于循环,不推:1毫秒
  • 对于循环,按下:2 ms
  • Foreach循环,不推:2毫秒
  • Foreach循环,推动:3毫秒
  • 循环时,不推:3毫秒
  • 循环时,不推:4毫秒
  • Util循环,不推:4 ms
  • Util循环,按下:5 ms

基本上,当你获得超过10000件物品时,你会开始看到真正的不同.因此,在0到10000个项目之间使用它并不重要.

package
{
    public class Loops{
        public static function forLoop(vector:Vector.<Foo>, usePush:Boolean = false):Array{
            var result:Array = [];

            for(var i:int = 0; i < vector.length; i++){
                if(usePush){
                    result.push(vector[i]);
                }else{
                    result[result.length] = vector[i];
                }
            }

            return result;          
        }

        public static function foreachLoop(vector:Vector.<Foo>, usePush:Boolean):Array{
            var result:Array = [];

            for each(var key:String in vector){
                if(usePush){
                    result.push(vector[key]);
                }else{
                    result[result.length] = vector[key];
                }
            }

            return result;          
        }

        public static function whileLoop(vector:Vector.<Foo>, usePush:Boolean):Array{
            var result:Array = [];

            var i:int = 0;
            while(i < vector.length){
                if(usePush){
                    result.push(vector[i]);
                }else{
                    result[result.length] = vector[i];
                }
            }

            return result;                      
        }

        public static function arrayUtilLoop(vector:Vector.<Foo>, usePush:Boolean):Array{
            var result:Array = [];

            function arrayUtilForeach(element:*, index:int, array:Array):void{
                if(usePush){
                    array.push(element);
                }else{
                    array[result.length] = element;
                }
            }           

            vector.forEach(arrayUtilForeach);

            return result;          
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用getTimer函数来做基准测试,所以它可能不是100%准确,但是不同的循环之间存在很大差异所以我认为不重要.

我希望有人发现这很有用.


小智 6

使用:

var myArray:Array = [];
myArray.push.apply(null, myVector);
Run Code Online (Sandbox Code Playgroud)

要么

var myArray:Array = new Array().concat(myVector);
Run Code Online (Sandbox Code Playgroud)