натисніть на кілька елементів для масиву


284

Я намагаюся просунути кілька елементів як один масив, але отримую помилку

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

Я намагаюся робити подібні речі, які б робив у рубіні, я думав, що applyце щось на кшталт *.

>> a = []
=> []
>> a.push(*[1,2])
=> [1, 2]

Відповіді:


240

При використанні більшості функцій об'єктів з applyабо call, то contextпараметр повинен бути об'єкт , який ви працюєте.

У цьому випадку вам потрібно a.push.apply(a, [1,2])(або більш правильно Array.prototype.push.apply(a, [1,2]))


618

Ви можете натиснути кілька елементів у масив наступним чином

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

console.log(a);


1
Ця відповідь та вибрана відповідь дають різні, а може і несподівані результати. a.push (1) vs. a.push ([1])
oevna

1
Хтось може пояснити, чому в цьому стільки голосів, ніж прийнята відповідь? Це може бути простіше, але менш гнучким. Якщо ви хочете об'єднати 2 масиви, це звичайно спрацює.
BluE

@BluE, якщо ви хочете об'єднати два масиви просто використовуйте array.concat ()
Florent Arlandis

@FlorentArlandis array.concat не працює, щоб додати 2-й масив до першого. Це створить нове. Я знаю, це схоже. Оператор розповсюдження - це те, що я шукав. Просто подивіться інші відповіді та коментарі там, щоб отримати детальну інформацію.
BluE

435

Тепер у ECMAScript2015 (він же ES6) ви можете використовувати оператор розповсюдження для додавання декількох елементів одночасно:

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

Дивіться таблицю сумісності Kangax ES6, щоб побачити, які веб-переглядачі сумісні


41
whaaaaaaat це приголомшливо, плюс, якщо ви це зробите в машинописному тексті, він буде компілюватися для 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)- це не велика справа і виглядає набагато чисто . Переміщення до старого масиву або заміна старого масиву новим залежить від ваших потреб. Якщо ви маєте справу з 10м + елементами, натискання на старий масив буде працювати швидше, якщо ви керуєте невеликими шматками, ви навряд чи знайдете різницю у швидкості. Обидва варіанти цілком законно.
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 )
mrun

1
На жаль, я не можу залишати коментарі під відповідями (крім моєї власної) через недостатню репутацію :). Але, мабуть, тут слід згадати, щоб мати повний огляд. Не могли б ви зробити це для мене? Тоді я видалю свою відповідь.
12кб

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.