Каков наиболее эффективный способ конкатенации N массивов объектов в JavaScript?
Массивы изменяемы, и результат может быть сохранен в одном из входных массивов.
Каков наиболее эффективный способ конкатенации N массивов объектов в JavaScript?
Массивы изменяемы, и результат может быть сохранен в одном из входных массивов.
Если вы объединяете более двух массивов, 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/....
[].concat.apply([], [array1, array2, ...])
редактировать: доказательство эффективности: http://jsperf.com/multi-array-concat/7
edit2: Тим Супини упоминает в комментариях, что это может привести к тому, что интерпретатор превысит размер стека вызовов. Возможно, это зависит от движка js, но я также получил "Максимальный размер стека вызовов превышен" по крайней мере в Chrome. Контрольный пример: [].concat.apply([], Array(300000).fill().map(_=>[1,2,3]))
. (Я также получил ту же ошибку при использовании принятого в настоящее время ответа, поэтому можно ожидать таких вариантов использования или создавать библиотеку для других, поэтому может потребоваться специальное тестирование независимо от того, какое решение вы выберете.)
Метод concat()
используется для объединения двух или более массивов. Он не изменяет существующие массивы, он возвращает только копию объединенных массивов.
array1 = array1.concat(array2, array3, array4, ..., arrayN);
Теперь вы можете использовать синтаксис 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]
Используйте 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]
Если вы находитесь посредине трубопровода, результат через карту/фильтр/сортировку и т.д., и вы хотите сконфигурировать массив массивов, вы можете использовать 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']
Для массива из нескольких массивов и 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 ]
Теперь мы можем объединить несколько массивов, используя 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]
Легко с помощью функции concat:
var a = [1,2,3];
var b = [2,3,4];
a = a.concat(b);
>> [1,2,3,2,3,4]
Вы можете использовать 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 раз медленнее в хроме.
где 'n' - некоторое количество массивов, возможно массив массивов.,.
var answer = _.reduce(n, function (a, b) {return a.concat(b)})
Вот функция, с помощью которой вы можете объединить несколько массивов
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]
Если у вас есть массив массивов и вы хотите объединить элементы в один массив, попробуйте следующий код (требуется 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];
Этот способ удобен, если вы не знаете, нет. массивов во время кода.
решено так
let arr = [[1, 2], [3, 4], [5, 6]];
console.log([].concat(...arr));
Укоротить с ES6.
new Set([].concat(...Array));
Это делает конкат и уникальным множественные массивы;
Если для concat имеется только два массива, и вам действительно нужно добавить один из массивов, а не создавать новый, то нажать или цикл - это путь.
Контрольный показатель: https://jsperf.com/concat-small-arrays-vs-push-vs-loop/
попробуйте следующее:
i=new Array("aaaa", "bbbb");
j=new Array("cccc", "dddd");
i=i.concat(j);
если N массивы получены из базы данных, а не жестко закодированы, я сделаю это, используя ES6
let get_fruits = [...get_fruits , ...DBContent.fruit];
Объединить массив с Push:
const array1 = [2, 7, 4];
const array2 = [3, 5,9];
array1.push(...array2);
console.log(array1)