Подтвердить что ты не робот

AS3 Самый быстрый способ слияния нескольких массивов

Я пытаюсь написать функцию, где я могу указать любое количество массива, а возвращаемое значение будет массивом, содержащим содержимое всех указанных массивов.

Я сделал это, но это похоже на очень медленный и уродливый способ сделать это:

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

Есть ли встроенный и более эффективный/хороший способ достижения этого? Результат не должен быть в том же порядке, что и вход - полностью несортированный - это нормально.

4b9b3361

Ответ 1

Вы можете использовать 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);

Чтобы сделать один массив из 2-мерного массива, вы можете использовать эту функцию:

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

Вы также можете использовать 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);

Ответ 2

Я не знаю, работает ли этот метод быстрее, чем использование циклов, но это (фантастический) быстрый способ объединить 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

Ответ 3

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

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

  return res;
}

Не пробовал, но что-то подобное вам поможет.