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,一个使用常规数组操作.
这是一个使用1000个项目的基准:
基本上,当你获得超过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)