вставить несколько элементов в массив

286

Я пытаюсь выдвинуть несколько элементов в один массив, но получаю ошибку

> a = []
[]
> a.push.apply(null, [1,2])
TypeError: Array.prototype.push called on null or undefined

Я пытаюсь сделать что-то подобное, что я бы сделал в ruby, я думал, что applyэто что-то вроде *.

>> a = []
=> []
>> a.push(*[1,2])
=> [1, 2]
evfwcqcg
источник

Ответы:

241

При использовании большинства функций объектов с applyили call, то contextпараметр должен быть объект , который вы работаете.

В этом случае вам нужно a.push.apply(a, [1,2])(или правильнее Array.prototype.push.apply(a, [1,2]))

Нит Тёмный Абсол
источник
620

Вы можете вставить несколько элементов в массив следующим образом

var a = [];
    
a.push(1, 2, 3);

console.log(a);

amit1310
источник
1
Этот ответ и выбранный ответ дают разные, и, возможно, неожиданные результаты. a.push (1) против a.push ([1])
oevna
1
Может кто-нибудь объяснить, почему у этого так много голосов, чем принятый ответ? Это может быть проще, но менее гибко. Если вы хотите объединить 2 массива, это не сработает.
BluE
@BluE, если вы хотите объединить два массива, просто используйте array.concat ()
Флорент Арландис
@FlorentArlandis array.concat не добавляет второй массив в первый. Это создаст новый. Я знаю, что это похоже. Оператор спреда - это то, что я искал. Просто посмотрите на другие ответы и комментарии там для деталей.
Блю
436

Теперь в ECMAScript2015 (он же ES6) вы можете использовать оператор распространения для добавления нескольких элементов одновременно:

var arr = [1];
var newItems = [2, 3];
arr.push(...newItems);
console.log(arr);

Посмотрите таблицу совместимости ES6 Kangax, чтобы увидеть, какие браузеры совместимы

canac
источник
41
что это здорово, плюс, если вы сделаете это в машинописном тексте, он скомпилируется в push.apply, чтобы обеспечить обратную совместимость
Chris
72

Вы можете использовать Array.concat:

var result = a.concat(b);
зрение
источник
16
Array.prototype.concat возвращает новый массив.
suricactus
12
Он хочет нажать на существующий массив, так Array.prototype.push.apply(arr1, arr2)что это правильный ответ, потому что с помощью arr1.concat(arr2)вы создаете новый массив.
suricactus
3
@suricactus arr1 = arr1.concat(arr2)не имеет большого значения и выглядит намного чище. Переход к старому массиву или замена старого массива новым зависит от ваших потребностей. Если вы работаете с 10m + элементами, перемещение в старый массив будет работать быстрее, если вы управляете небольшими порциями, вы вряд ли найдете разницу в скорости. Оба варианта вполне законны.
VisioN
5
@YuvalA. prototype.push.applyзвонит только pushодин раз. И вышеупомянутое различие не является обязательным в отношении скорости, но операция на месте против создания нового массива. Что если бы у меня был метод, который взял массив и должен был изменить его на месте? concatМетод не может работать, даже с кодом VisionN, поскольку она не будет изменять переменную для вызывающей функции.
coderforlife
1
a = a.concat(b)синтаксис по-прежнему короче, чемArray.prototype.push.apply(arr1, arr2)
Aizzat Suhardi
22

Если вам нужна альтернатива Array.concatв ECMAScript 2015 (также известная как ES6, ES2015), которая не изменяет массив, но возвращает новый массив, вы можете использовать оператор распространения следующим образом:

var arr = [1];
var newItems = [2, 3];
var newerItems = [4, 5];
var newArr = [...arr, ...newItems, ...newerItems];
console.log(newArr);

Обратите внимание, что этот pushметод отличается от метода, поскольку pushметод изменяет / модифицирует массив.

Если вы хотите узнать, работают ли определенные функции ES2015 в вашем браузере, проверьте таблицу совместимости Kangax .

Вы также можете использовать Babel или аналогичный транспортер, если вы не хотите ждать поддержки браузера и хотите использовать ES2015 в производстве.

Джон
источник
4

Есть много ответов рекомендуют использовать: Array.prototype.push(a, b). Это хороший способ, НО, если у вас будет действительно большой b, у вас будет ошибка переполнения стека (из-за слишком большого количества аргументов). Будьте осторожны здесь.

См. Каков наиболее эффективный способ объединения N массивов? Больше подробностей.

12KB
источник
3
Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом. [Как мне написать хороший ответ? ] ( stackoverflow.com/help/how-to-answer )
март
1
Извините, я не могу оставлять комментарии под ответами (кроме своих) из-за недостаточной репутации :). Но, кажется, это следует упомянуть здесь, чтобы иметь полный обзор. Не могли бы вы сделать это для меня? Тогда я удалю свой ответ.
12kb
0
var a=[];
a.push({
 name_a:"abc",
 b:[]
});

a.b.push({
  name_b:"xyz"
});
Алекс Кумбхани
источник