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));
Есть ли встроенный и более эффективный / хороший способ достижения этого? Результат не обязательно должен быть в том же порядке, что и вход - полностью не отсортированный - это нормально.
3 ответа
Вы можете использовать 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);
Чтобы сделать один массив из двухмерного массива, вы можете использовать эту функцию:
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);
Я не знаю, быстрее ли этот метод, чем использование циклов, но это (причудливый) быстрый способ объединения двух массивов. (и это работает в 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
function merge(...multi):Array
{
var res:Array = [];
for each(var i:Array in multi)
{
res = res.concat(i);
}
return res;
}
Не пробовал, но что-то подобное поможет вам.