Saya memiliki array JavaScript dataArray
yang ingin saya dorong ke array baru newArray
. Kecuali Aku tidak ingin newArray[0]
menjadi dataArray
. Saya ingin memasukkan semua item ke dalam array baru:
var newArray = [];
newArray.pushValues(dataArray1);
newArray.pushValues(dataArray2);
// ...
atau bahkan lebih baik:
var newArray = new Array (
dataArray1.values(),
dataArray2.values(),
// ... where values() (or something equivalent) would push the individual values into the array, rather than the array itself
);
Jadi sekarang array baru berisi semua nilai array data individual. Apakah ada singkatan seperti yang pushValues
tersedia sehingga saya tidak perlu mengulangi setiap individu dataArray
, menambahkan item satu per satu?
javascript
arrays
bba
sumber
sumber
Jawaban:
Gunakan fungsi concat , seperti:
Nilai
newArray
akan[1, 2, 3, 4]
(arrayA
danarrayB
tetap tidak berubah;concat
membuat dan mengembalikan array baru untuk hasilnya).sumber
Google Chrome
: fast (concat = winner) ,:Opera
fast (concat = winner) ,:IE
slow (concat = winner)Firefox
,: slow (push.apply = winner, namun 10 kali lebih lambat dari concat Chrome) ... berbicara tentang implementasi mesin JS yang buruk .push
tidak akan meratakan array nilai.concat
mencapai apa yang dituntut dari pertanyaan itu.Asalkan array Anda tidak besar (lihat peringatan di bawah), Anda dapat menggunakan
push()
metode array yang ingin Anda tambahkan nilai.push()
dapat mengambil beberapa parameter sehingga Anda dapat menggunakanapply()
metodenya untuk meneruskan array nilai yang akan didorong sebagai daftar parameter fungsi. Ini memiliki keunggulan dibandingkan menggunakanconcat()
menambahkan elemen ke array di tempat daripada membuat array baru.Namun, tampaknya untuk array besar (dari urutan 100.000 anggota atau lebih), trik ini bisa gagal . Untuk array seperti itu, menggunakan loop adalah pendekatan yang lebih baik. Lihat https://stackoverflow.com/a/17368101/96100 untuk detailnya.
Anda mungkin ingin menggeneralisasi ini menjadi fungsi:
... atau tambahkan ke
Array
prototipe:... atau meniru
push()
metode asli dengan memungkinkan beberapa parameter menggunakan fakta yangconcat()
, sepertipush()
, memungkinkan beberapa parameter:Berikut ini adalah versi berbasis loop dari contoh terakhir, cocok untuk array besar dan semua browser utama, termasuk IE <= 8:
sumber
newArray.push.apply(newArray, dataArray1);
memberikan hal yang sama sepertiArray.prototype.push.applay(newArray,dataArra1);
Array.prototype.concat
tidak buruk, melainkan hanya disalahpahami dan kadang-kadang disalahgunakan. Dalam keadaan ini, itu hanya disalahpahami, tetapi tidak disalahgunakan.Saya akan menambahkan satu lagi "bukti masa depan"
Di ECMAScript 6, Anda dapat menggunakan sintaks Spread :
Sintaksis yang menyebar belum termasuk dalam semua browser utama. Untuk kompatibilitas saat ini, lihat tabel kompatibilitas (terus diperbarui) ini .
Namun, Anda dapat menggunakan sintaks spread dengan Babel.js .
edit:
Lihat balasan Jack Giffin di bawah ini untuk komentar lebih lanjut tentang kinerja. Tampaknya concat masih lebih baik dan lebih cepat daripada operator yang tersebar.
sumber
newArray.apply(newArray, dataArray1)
.Menemukan cara yang elegan dari MDN
Atau Anda dapat menggunakan
spread operator
fitur ES6:sumber
Apakah itu menyelesaikan masalah Anda?
sumber
Berikut ini tampaknya paling sederhana bagi saya:
Saat "push" mengambil sejumlah variabel argumen, Anda bisa menggunakan
apply
metodepush
fungsi untuk mendorong semua elemen dari array lain. Itu membangun panggilan untuk mendorong menggunakan argumen pertama ("newArray" di sini) sebagai "ini" dan elemen-elemen dari array sebagai argumen yang tersisa.Dalam
slice
pernyataan pertama mendapat salinan array pertama, jadi Anda tidak memodifikasinya.Perbarui Jika Anda menggunakan versi javascript dengan slice yang tersedia, Anda dapat menyederhanakan
push
ekspresi menjadi:sumber
Fungsi di bawah ini tidak memiliki masalah dengan panjang array dan berkinerja lebih baik daripada semua solusi yang disarankan:
Sayangnya, jspref menolak untuk menerima kiriman saya, jadi inilah hasilnya menggunakan benchmark.js
dimana
untuk loop dan push adalah:
Dorong Terapkan:
operator penyebaran:
dan akhirnya 'atur panjang dan untuk loop' adalah fungsi di atas
sumber
𝗥𝗲𝘀𝗲𝗮𝗿𝗰𝗵 𝗔𝗻𝗱 𝗥𝗲𝘀𝘂𝗹𝘁𝘀
Faktanya, tes kinerja di jsperf dan memeriksa beberapa hal di konsol dilakukan. Untuk penelitian, situs web irt.org digunakan. Di bawah ini adalah kumpulan dari semua sumber ini disatukan ditambah fungsi contoh di bagian bawah.
Seperti yang terlihat di atas, saya berpendapat bahwa Concat hampir selalu merupakan cara yang baik untuk kinerja dan kemampuan untuk mempertahankan jarangnya array cadangan. Kemudian, untuk array-like (seperti DOMNodeLists like
document.body.children
), saya akan merekomendasikan menggunakan for loop karena keduanya adalah yang paling berkinerja 2 dan satu-satunya metode lain yang mempertahankan array jarang. Di bawah ini, kita akan dengan cepat membahas apa yang dimaksud dengan array jarang dan array-suka untuk menghilangkan kebingungan.𝗧𝗵𝗲 𝗙𝘂𝘁𝘂𝗿𝗲
Pada awalnya, beberapa orang mungkin berpikir bahwa ini adalah kebetulan dan bahwa vendor browser pada akhirnya akan mengoptimalkan Array.prototype.push agar cukup cepat untuk mengalahkan Array.prototype.concat. SALAH! Array.prototype.concat akan selalu lebih cepat (setidaknya pada prinsipnya) karena ini adalah copy-n-paste sederhana atas data. Di bawah ini adalah diagram persuado-visual yang disederhanakan dari apa yang terlihat seperti implementasi array 32-bit (harap dicatat implementasi nyata BANYAK yang lebih rumit)
Seperti yang terlihat di atas, semua yang perlu Anda lakukan untuk menyalin sesuatu seperti itu hampir sesederhana menyalinnya byte demi byte. Dengan Array.prototype.push.apply, ini lebih dari sekadar copy-n-paste ke data. ".Apply" harus memeriksa setiap indeks dalam array dan mengubahnya menjadi seperangkat argumen sebelum meneruskannya ke Array.prototype.push. Kemudian, Array.prototype.push juga harus mengalokasikan lebih banyak memori setiap kali, dan (untuk beberapa implementasi browser) bahkan mungkin menghitung ulang beberapa data pencarian posisi untuk sparseness.
Cara alternatif untuk memikirkannya adalah ini. Sumber array satu adalah tumpukan besar kertas dijepit bersama. Array sumber dua juga merupakan tumpukan kertas lain. Apakah akan lebih cepat bagimu untuk melakukannya
Dalam analogi di atas, opsi # 1 mewakili Array.prototype.concat sedangkan # 2 mewakili Array.prototype.push.apply. Mari kita menguji ini dengan JSperf serupa yang hanya berbeda dalam hal ini menguji metode over array jarang, bukan solid array. Orang dapat menemukannya di sini .
Oleh karena itu, saya menyatakan kasus saya bahwa masa depan kinerja untuk kasus penggunaan khusus ini tidak terletak pada Array.prototype.push, melainkan pada Array.prototype.concat.
𝗖𝗹𝗮𝗿𝗶𝗳𝗶𝗰𝗮𝘁𝗶𝗼𝗻𝘀
𝗦𝗽𝗮𝗿𝗲 𝗔𝗿𝗿𝗮𝘆𝘀
Ketika beberapa anggota array hilang. Sebagai contoh:
Atau, javascript memungkinkan Anda untuk menginisialisasi array cadangan dengan mudah.
𝗔𝗿𝗿𝗮𝘆-𝗟𝗶𝗸𝗲𝘀
Seperti array adalah objek yang memiliki setidaknya
length
properti, tetapi tidak diinisialisasi dengannew Array
atau[]
; Sebagai contoh, objek di bawah ini diklasifikasikan sebagai array-like.Amati apa yang terjadi menggunakan metode yang memaksa-suka array ke dalam array seperti slice.
Tampilkan cuplikan kode
Amati apa yang terjadi dengan menggunakan metode yang tidak memaksa array-like ke dalam array seperti concat.
Tampilkan cuplikan kode
sumber
Dengan JavaScript ES6, Anda dapat menggunakan ... operator sebagai operator spread yang pada dasarnya akan mengubah array menjadi nilai. Kemudian, Anda dapat melakukan sesuatu seperti ini:
Meskipun sintaksnya singkat, saya tidak tahu bagaimana ini bekerja secara internal dan apa implikasi kinerja pada array yang besar.
sumber
Array.push.apply
teknik.Inilah cara ES6
sumber
Ada sejumlah jawaban yang berbicara tentang Array.prototype.push.apply . Ini adalah contoh yang jelas:
Jika Anda memiliki sintaks ES6:
sumber
Jika Anda ingin memodifikasi array asli, Anda dapat menyebar dan menekan:
Jika Anda ingin memastikan hanya item dengan tipe yang sama masuk dalam
source
array (tidak mencampur angka dan string misalnya), maka gunakan TypeScript.sumber
Kami memiliki dua array a dan b. kode yang dilakukan di sini adalah array nilai didorong ke array b.
sumber
Coba ini:
sumber
alih-alih fungsi push () gunakan fungsi concat untuk IE. contoh,
sumber
Тhis adalah kode yang berfungsi dan berfungsi dengan baik:
sumber