在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()函数隐藏在标准库的某个地方?
答案 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()的公共函数,然后你就可以在该函数中使用该代码,这样你就不必在每次转换时都编写它。
编辑:今天发现这个老问题,并认为在周日早上对所有不同方法进行基准测试会很有趣。
我使用了一个包含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;
}
}
}
我使用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;