dorong beberapa elemen ke array

284

Saya mencoba untuk mendorong beberapa elemen sebagai satu array, tetapi mendapatkan kesalahan

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

Saya mencoba melakukan hal serupa yang akan saya lakukan di ruby, saya berpikir itu applyadalah sesuatu seperti *.

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

Jawaban:

240

Saat menggunakan sebagian besar fungsi objek dengan applyatau call, contextparameter HARUS menjadi objek yang sedang Anda kerjakan.

Dalam hal ini, Anda perlu a.push.apply(a, [1,2])(atau lebih tepatnya Array.prototype.push.apply(a, [1,2]))

Niet the Dark Absol
sumber
616

Anda bisa mendorong beberapa elemen ke dalam array dengan cara berikut

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

console.log(a);

amit1310
sumber
1
Jawaban ini dan jawaban yang dipilih menghasilkan hasil yang berbeda, dan mungkin tidak terduga. a.push (1) vs. a.push ([1])
oevna
1
Adakah yang bisa menjelaskan, mengapa ini memiliki lebih banyak suara daripada jawaban yang diterima? Mungkin lebih mudah, tetapi kurang fleksibel. Jika Anda ingin menggabungkan 2 array, ini tidak akan berfungsi.
BluE
@BluE jika Anda ingin menggabungkan dua array cukup gunakan array.concat ()
Florent Arlandis
@FlorentArlandis array.concat tidak berfungsi untuk menambahkan array ke-2 ke yang pertama. Itu akan membuat yang baru. Saya tahu ini mirip. Operator penyebaran adalah apa yang saya cari. Lihat saja jawaban dan komentar lain di sana untuk detailnya.
BluE
435

Sekarang di ECMAScript2015 (alias ES6), Anda dapat menggunakan operator spread untuk menambahkan beberapa item sekaligus:

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

Lihat tabel kompatibilitas ES6 Kangax untuk melihat browser apa yang kompatibel

canac
sumber
41
whaaaaaaat ini luar biasa, plus, jika Anda melakukannya dalam naskah, itu akan dikompilasi untuk push.apply sehingga Anda memiliki kompatibilitas ke belakang
Chris
72

Anda bisa menggunakan Array.concat:

var result = a.concat(b);
Penglihatan
sumber
16
Array.prototype.concat mengembalikan array baru.
suricactus
12
Dia ingin mendorong ke array yang ada jadi Array.prototype.push.apply(arr1, arr2)adalah jawaban yang benar, karena menggunakan arr1.concat(arr2)Anda membuat array baru.
suricactus
3
@ Suricactus arr1 = arr1.concat(arr2)bukan masalah besar dan terlihat jauh lebih bersih. Mendorong ke array lama atau mengganti array lama dengan yang baru tergantung pada kebutuhan Anda. Jika Anda berurusan dengan elemen 10m + mendorong ke array lama akan bekerja lebih cepat, jika Anda mengelola potongan kecil Anda hampir tidak menemukan perbedaan dalam kecepatan. Kedua opsi tersebut sepenuhnya sah.
VisioN
5
@ YuvalA. prototype.push.applyhanya menelepon pushsekali. Dan perbedaan di atas tidak perlu tentang kecepatan tetapi operasi di tempat vs membuat array baru. Bagaimana jika saya memiliki metode yang mengambil array dan seharusnya memodifikasinya di tempat? The concatMetode tidak mungkin bekerja, bahkan dengan kode VisionN ini karena tidak akan memodifikasi variabel untuk pemanggil fungsi.
coderforlife
1
a = a.concat(b)masih merupakan sintaks yang lebih pendek dariArray.prototype.push.apply(arr1, arr2)
Aizzat Suhardi
22

Jika Anda ingin alternatif Array.concatdalam ECMAScript 2015 (alias ES6, ES2015) yang, seperti itu, tidak mengubah array tetapi mengembalikan array baru Anda dapat menggunakan operator spread seperti:

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

Catatan ini berbeda dari pushmetode karena pushmetode ini mengubah / memodifikasi array.

Jika Anda ingin melihat apakah fitur ES2015 tertentu berfungsi di browser Anda, periksa tabel kompatibilitas Kangax .

Anda juga dapat menggunakan Babel atau transpiler serupa jika Anda tidak ingin menunggu dukungan browser dan ingin menggunakan ES2015 dalam produksi.

John
sumber
4

Ada banyak jawaban merekomendasikan penggunaan: Array.prototype.push(a, b). Ini cara yang baik, TAPI jika Anda akan memiliki b yang sangat besar, Anda akan memiliki kesalahan stack overflow (karena terlalu banyak argumen). Hati-hati di sini.

Lihat Apa cara yang paling efisien untuk menggabungkan N array? untuk lebih jelasnya.

12kb
sumber
3
Ini tidak memberikan jawaban untuk pertanyaan itu. Untuk mengkritik atau meminta klarifikasi dari penulis, tinggalkan komentar di bawah posting mereka. [Bagaimana saya menulis jawaban yang bagus? ] ( stackoverflow.com/help/how-to-answer )
mrun
1
Maaf, saya tidak dapat meninggalkan komentar di bawah jawaban (kecuali saya sendiri) karena reputasi tidak cukup :). Tetapi sepertinya ini harus disebutkan di sini untuk memiliki gambaran lengkap. Bisakah Anda melakukannya untuk saya? Maka saya akan menghapus jawaban saya.
12kb
0
var a=[];
a.push({
 name_a:"abc",
 b:[]
});

a.b.push({
  name_b:"xyz"
});
Alex Kumbhani
sumber