AS3合并多个阵列的最快方法

Mar*_*rty 10 arrays actionscript-3 merging-data

我正在尝试编写一个函数,我可以指定任意数量的数组,返回值将是一个包含所有指定数组内容的数组.

我已经做到了,但这似乎是一种非常缓慢而丑陋的方式:

var ar1:Array = [1,2,3,4,5,6,7,8,9];
var ar2:Array = ['a','b','c','d','e','f','g','h'];


function merge(...multi):Array
{
    var out:String = "";

    for each(var i:Array in multi)
    {
        out += i.join(',');
    }

    return out.split(',');
}

trace(merge(ar1, ar2));
Run Code Online (Sandbox Code Playgroud)

是否有内置且更有效/更好的方法来实现这一目标?结果不需要与输入的顺序相同 - 完全未排序就好了.

kap*_*pex 22

你可以使用concat.

如果参数指定数组,则连接该数组的元素.

var ar1:Array = [1,2,3,4,5,6,7,8,9];
var ar2:Array = ['a','b','c','d','e','f','g','h'];
var ar3:Array = ['i','j','k','l'];

var ar4 = ar1.concat(ar2, ar3); // or: ar1.concat(ar2).concat(ar3);
Run Code Online (Sandbox Code Playgroud)

要从二维数组中制作单个数组,您可以使用此函数:

private function flatten(arrays:Array):Array {
    var result:Array = [];
    for(var i:int=0;i<arrays.length;i++){
        result = result.concat(arrays[i]);
    }
    return result;
}

// call
var ar4 = [ar1, ar2, ar3];
var ar5 = flatten(ar4);
Run Code Online (Sandbox Code Playgroud)

您还可以使用varargs合并多个数组:

private function merge(...arrays):Array {
    var result:Array = [];
    for(var i:int=0;i<arrays.length;i++){
        result = result.concat(arrays[i]);
    }
    return result;
}

// call
var ar5 = merge(ar1, ar2, ar3);
Run Code Online (Sandbox Code Playgroud)


Mar*_*nol 8

我不知道这种方法是否比使用循环更快,但它是一种(花哨)快速合并2个数组的方法.(它适用于Javascript和Actionscript)

var arr1:Array = [1,2,3,4,5]
var arr2:Array = [6,7,8,9,10]

arr1.push.apply(this, arr2); // merge 
// arr1.push.call(this, arr2); // don't use this. see comment below

trace(arr1) // 1,2,3,4,5,6,7,8,9,10
Run Code Online (Sandbox Code Playgroud)

  • 你可能意味着`arr1.push.apply(this,arr2);`.使用call会给你一个不同的结果(跟踪生成的数组不会很明显).如果你调用`push`,你最终会得到一个锯齿状的数组,有6个元素:'1,2,3,4,5'和另一个包含数字`6,7,8,9,10'的数组索引5.但是你想要一个扁平的连接数组,所以要么使用`concat`(在这种情况下最有意义),要么使用`push`和`apply`. (7认同)