AS3:如何将Vector转换为数组

时间:2009-07-10 05:12:23

标签: actionscript-3 arrays vector

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

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

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

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

这留下了稍微冗长的一点:

var myArray:Array = new Array();
for each (var elem:Foo in myVector) {
    myArray.push(elem);
}

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

8 个答案:

答案 0 :(得分:24)

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

修改

要构建实用程序功能,您可能必须按如下方式删除该类型:

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

答案 1 :(得分: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;
}

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

Vector documentation

编辑:今天发现这个老问题,并认为在周日早上对所有不同方法进行基准测试会很有趣。

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

  • For循环,不推: 520 ms
  • 对于循环,请按: 1027 ms
  • Foreach循环,而非推送: 1753 ms
  • Foreach循环,推送: 2264 ms
  • while循环,而不是推送: 2775 ms
  • while循环,而不是推送: 3282 ms
  • Util循环,而不是推送: 4059 ms
  • Util循环,推送: 4570 ms

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

  • For loop,not push: 1 ms
  • For循环,按: 2 ms
  • Foreach循环,而不是推送: 2 ms
  • Foreach循环,推送: 3 ms
  • while循环,而不是推送: 3 ms
  • while循环,而不是推送: 4 ms
  • 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;          
        }
    }
}

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

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

答案 2 :(得分:6)

使用:

var myArray:Array = [];
myArray.push.apply(null, myVector);

var myArray:Array = new Array().concat(myVector);

答案 3 :(得分:3)

每个

都不能保证您商品的订单相同。
for in应该给你一个更接近的匹配。

    private var _vector:*;

    public function VectorUtil(vector:*)
    {
        _vector = vector;
    }

    public function toArray():Array
    {
        var a:Array = [];
        for (var i:int = 0; i < _vector.length; ++i)
            a.push(_vector[i]);
        return a;
    }

答案 4 :(得分:3)

Vaukalak的第二个答案不仅有效,而且比这里的最高投票答案要快得多,因为[]比新的Array()产生的阵列结构快一些,所以我按摩了一点。下面还包括从数组创建Vector的最佳方法。

// make a Vector from an array
var toVector : Vector.<String> = Vector.<String>(['a','b','c']) 

// populate an array from a Vector
var toArray : Array = [].concat(toVector);

请注意,这似乎只适用于Flash 11

答案 5 :(得分:0)

对Vector中每个元素的函数调用将会慢一些,特别是在较长的Vector中。但是,这些示例可能都是等效的,除非您处理相当长的Vector / Array - 易读性和易用性通常比优化更重要。

说,我认为最快的方法是使用带迭代器的while循环与0进行比较。

var myArray:Array = new Array(myVector.length);
var i:int=myVector.length;
while (i--) {
    myArray[i] = myVector[i];
}

不幸的是,你不能将这种技术填充到一个易于重复使用的方法中,因为没有办法指定泛型基类型的Vector方法参数.... :(

答案 6 :(得分:-4)

如果你有一个字符串向量,你可以这样做:

myArray = myVec.join(",").split(",");

快速而脏的数组转换。

答案 7 :(得分:-13)

var a:Array = some_vector as Array;