Marty
Marty

Reputation: 39456

AS3 Fastest way to merge multiple arrays

I'm trying to write a function where I can specify any amount of array, and the return value will be an array containing the contents of all of the specified arrays.

I've done this, but it seems like a really slow and ugly way of doing it:

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));

Is there an inbuilt and more efficient / nice way of achieving this? The result does not need to be in the same order as the input - completely unsorted is fine.

Upvotes: 12

Views: 21571

Answers (3)

Mark Knol
Mark Knol

Reputation: 10163

I don't know if this method is faster than using loops, but it is a (fancy) quick way to merge 2 arrays. (and it works in Javascript and 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

Upvotes: 8

kapex
kapex

Reputation: 29959

You can use concat.

If the parameters specify an array, the elements of that array are concatenated.

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);

To make a single array out of a 2 dimensional array you can use this function:

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);

You can also use varargs to merge multiple arrays:

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);

Upvotes: 24

ymutlu
ymutlu

Reputation: 6715

function merge(...multi):Array
{
  var res:Array = [];

  for each(var i:Array in multi)
  {
    res = res.concat(i);
  }

  return res;
}

Didnt try it, but something like this would help you.

Upvotes: 2

Related Questions