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


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]

Ответы:


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


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, чтобы увидеть, какие браузеры совместимы


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 массивов? Больше подробностей.


3
Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом. [Как мне написать хороший ответ? ] ( stackoverflow.com/help/how-to-answer )
— март

1
Извините, я не могу оставлять комментарии под ответами (кроме своих) из-за недостаточной репутации :). Но, кажется, это следует упомянуть здесь, чтобы иметь полный обзор. Не могли бы вы сделать это для меня? Тогда я удалю свой ответ.
— 12kb

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.