Каков наиболее эффективный способ конкатенации N массивов?

Каков наиболее эффективный способ конкатенации N массивов объектов в JavaScript?

Массивы изменяемы, и результат может быть сохранен в одном из входных массивов.

Ответ 1

Если вы объединяете более двух массивов, concat() - это путь для удобства и вероятной производительности.

var a = [1, 2], b = ["x", "y"], c = [true, false];
var d = a.concat(b, c);
console.log(d); // [1, 2, "x", "y", true, false];

Для объединения только двух массивов, тот факт, что push принимает несколько аргументов, состоящих из элементов для добавления в массив, может использоваться вместо этого, чтобы добавлять элементы из одного массива в конец другого без создания нового массива. С помощью slice() он также может использоваться вместо concat(), но от этого не будет никакого преимущества в производительности.

var a = [1, 2], b = ["x", "y"];
a.push.apply(a, b);
console.log(a); // [1, 2, "x", "y"];

В ECMAScript 2015 и более поздних версиях это может быть еще более уменьшено до

a.push(...b)

Однако, похоже, что для больших массивов (порядка 100 000 членов или более) метод, передающий массив элементов push (либо с использованием apply(), либо с помощью оператора распространения ECMAScript 2015), может выйти из строя. Для таких массивов использование цикла является лучшим подходом. Подробнее см. fooobar.com/questions/13475/....

Ответ 2

[].concat.apply([], [array1, array2, ...])

редактировать: доказательство эффективности: http://jsperf.com/multi-array-concat/7

edit2: Тим Супини упоминает в комментариях, что это может привести к тому, что интерпретатор превысит размер стека вызовов. Возможно, это зависит от движка js, но я также получил "Максимальный размер стека вызовов превышен" по крайней мере в Chrome. Контрольный пример: [].concat.apply([], Array(300000).fill().map(_=>[1,2,3])). (Я также получил ту же ошибку при использовании принятого в настоящее время ответа, поэтому можно ожидать таких вариантов использования или создавать библиотеку для других, поэтому может потребоваться специальное тестирование независимо от того, какое решение вы выберете.)

Ответ 3

Метод concat() используется для объединения двух или более массивов. Он не изменяет существующие массивы, он возвращает только копию объединенных массивов.

array1 = array1.concat(array2, array3, array4, ..., arrayN);

Ответ 4

Для людей, использующих ES2015 (ES6)

Теперь вы можете использовать синтаксис Spread для объединения массивов:

const arr1 = [0, 1, 2],
      arr2 = [3, 4, 5];

const result1 = [...arr1, ...arr2]; // -> [0, 1, 2, 3, 4, 5]

// or...

const result2 = [...arr2, ...arr1]; // -> [3, 4, 5, 0, 1, 2]

Ответ 5

Используйте Array.prototype.concat.apply для управления несколькими конкатенациями массивов:

var resultArray = Array.prototype.concat.apply([], arrayOfArraysToConcat);

Пример:

var a1 = [1, 2, 3],
    a2 = [4, 5],
    a3 = [6, 7, 8, 9];
Array.prototype.concat.apply([], [a1, a2, a3]); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

Ответ 6

Если вы находитесь посредине трубопровода, результат через карту/фильтр/сортировку и т.д., и вы хотите сконфигурировать массив массивов, вы можете использовать reduce

let sorted_nums = ['1,3', '4,2']
  .map(item => item.split(','))   // [['1', '3'], ['4', '2']]
  .reduce((a, b) => a.concat(b))  // ['1', '3', '4', '2']
  .sort()                         // ['1', '2', '3', '4']

Ответ 7

Для массива из нескольких массивов и ES6 используйте

Array.prototype.concat(...arr);

Например:

const arr = [[1, 2, 3], [4, 5, 6], [7, 8 ,9]];
const newArr = Array.prototype.concat(...arr);
// output: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

Ответ 8

Теперь мы можем объединить несколько массивов, используя ES6 Spread. Вместо использования concat() для объединения массивов, попробуйте использовать синтаксис расширения, чтобы объединить несколько массивов в один плоский массив. например:

var a = [1,2];
var b = [3,4];
var c = [5,6,7];
var d = [...a, ...b, ...c];
// resulting array will be like d = [1,2,3,4,5,6,7]

Ответ 9

Легко с помощью функции concat:

var a = [1,2,3];
var b = [2,3,4];
a = a.concat(b);
>> [1,2,3,2,3,4]

Ответ 10

Вы можете использовать jsperf.com сайт для сравнения производительности. Вот ссылка на concat.

Добавлено сравнение между:

var c = a.concat(b);

и

var c = [];
for (i = 0; i < a.length; i++) {
    c.push(a[i]);
}
for (j = 0; j < b.length; j++) {
    c.push(b[j]);
}

Второй почти в 10 раз медленнее в хроме.

Ответ 11

где 'n' - некоторое количество массивов, возможно массив массивов.,.

var answer = _.reduce(n, function (a, b) {return a.concat(b)})

Ответ 12

Вот функция, с помощью которой вы можете объединить несколько массивов

function concatNarrays(args) {
    args = Array.prototype.slice.call(arguments);
    var newArr = args.reduce( function(prev, next) {
       return prev.concat(next) ;
    });

    return newArr;
}

Пример -

console.log(concatNarrays([1, 2, 3], [5, 2, 1, 4], [2,8,9]));

выводит

[1,2,3,5,2,1,4,2,8,9]

Ответ 13

Если у вас есть массив массивов и вы хотите объединить элементы в один массив, попробуйте следующий код (требуется ES2015):

let arrOfArr = [[1,2,3,4],[5,6,7,8]];
let newArr = [];
for (let arr of arrOfArr) {
    newArr.push(...arr);
}

console.log(newArr);
//Output: [1,2,3,4,5,6,7,8];

Или если вы в функциональном программировании

let arrOfArr = [[1,2,3,4],[5,6,7,8]];
let newArr = arrOfArr.reduce((result,current)=>{
    result.push(...current);
    return result;
});

console.log(newArr);
//Output: [1,2,3,4,5,6,7,8];

Или даже лучше с синтаксисом ES5, без оператора распространения

var arrOfArr = [[1,2,3,4],[5,6,7,8]];
var newArr = arrOfArr.reduce((result,current)=>{
    return result.concat(current);
});
console.log(newArr);
//Output: [1,2,3,4,5,6,7,8];

Этот способ удобен, если вы не знаете, нет. массивов во время кода.

Ответ 14

решено так

let arr = [[1, 2], [3, 4], [5, 6]];
 console.log([].concat(...arr));

Ответ 15

Укоротить с ES6.

new Set([].concat(...Array));

Это делает конкат и уникальным множественные массивы;

Демо на коде

Ответ 16

Если для concat имеется только два массива, и вам действительно нужно добавить один из массивов, а не создавать новый, то нажать или цикл - это путь.

Контрольный показатель: https://jsperf.com/concat-small-arrays-vs-push-vs-loop/

Ответ 17

попробуйте следующее:

i=new Array("aaaa", "bbbb");
j=new Array("cccc", "dddd");

i=i.concat(j);

Ответ 18

если N массивы получены из базы данных, а не жестко закодированы, я сделаю это, используя ES6

let get_fruits = [...get_fruits , ...DBContent.fruit];

Ответ 19

Объединить массив с Push:

const array1 = [2, 7, 4];
const array2 = [3, 5,9];
array1.push(...array2);
console.log(array1)