Ini ialah artikel ringkas tentang beberapa petua tentang menggunakan tatasusunan JavaScript. Kami akan menggunakan kaedah yang berbeza untuk menggabungkan/menggabungkan dua tatasusunan JS, serta membincangkan kelebihan/kelemahan setiap kaedah.
Mari kita pertimbangkan dahulu situasi berikut:
concat(..)
Ini ialah pendekatan yang paling biasa:
Seperti yang anda lihat, C ialah tatasusunan serba baharu, mewakili gabungan dua tatasusunan a dan b, menjadikan A dan B tidak berubah. Simple kan?
Tetapi bagaimana jika a mempunyai 10,000 elemen dan b juga mempunyai 10,000 elemen? C akan mempunyai 20,000 elemen, jadi penggunaan memori a dan b akan berganda.
“Tiada masalah!”, anda berkata. Biarkan mereka menjadi sampah dikutip, tetapkan A dan B kepada batal, masalah selesai!
Sisipan gelung
Baiklah, mari salin kandungan satu tatasusunan kepada tatasusunan yang lain, menggunakan: Array#push(..)
Nampaknya mempunyai jejak ingatan yang lebih baik.
Tetapi bagaimana jika tatasusunan a lebih kecil? Atas sebab ingatan dan kelajuan, anda mungkin mahu meletakkan a yang lebih kecil di hadapan b. Tiada masalah, cuma gantikan push(..) dengan unshift(..):
Petua Fungsi
Namun, gelung for memang hodoh dan sukar diselenggara. Bolehkah kita berbuat lebih baik?
Ini adalah percubaan pertama kami, menggunakan Array#reduce:
a; // [1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]
// atau `a` ke dalam `b`:
b = a.reduceRight( fungsi(coll,item){
coll.unshift(item);
Pulangan coll;
}, b );
b; // [1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]
Array#reduce(..) dan Array#reduceRight(..) bagus, tetapi ia agak kikuk. Fungsi anak panah ES6=> akan mengurangkan jumlah kod beberapa, tetapi ia masih memerlukan fungsi yang perlu dipanggil sekali untuk setiap elemen, yang tidak sempurna.
Bagaimana pula dengan ini:
a; // [1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]
// atau `a` ke dalam `b`:
b.unshift.apply( b, a );
b; // [1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]
Yang ini jauh lebih baik, bukan? Terutama kerana kaedah unshift(..) tidak perlu risau tentang pengisihan terbalik sebelumnya di sini. Operasi span ES6 akan menjadi lebih cantik: a.push( ...b) atau b.unshift( ...a
Had panjang tatasusunan maksimum
Isu utama pertama ialah penggunaan memori telah meningkat dua kali ganda (tentu saja untuk sementara waktu!) dan apa yang dilampirkan pada asasnya ialah menyalin elemen ke tindanan melalui panggilan fungsi. Selain itu, enjin JS yang berbeza mempunyai had pada panjang data yang disalin.
Jadi, jika tatasusunan mempunyai sejuta elemen, anda pasti akan melebihi had timbunan panggilan yang dibenarkan untuk push(...) atau unshift(...). Malangnya, ia akan melakukan kerja yang baik dengan beberapa ribu elemen, tetapi anda perlu berhati-hati untuk tidak melebihi had panjang yang munasabah.
Nota: Anda boleh mencuba splice(...), yang mempunyai masalah yang sama seperti push(...) dan unshift(...).
Ada cara untuk mengelakkan had panjang maksimum ini.
Tunggu sebentar, kebolehbacaan kami adalah ke belakang. Itu sahaja, mungkin bertambah teruk apabila berubah, haha.