Berikut adalah artikel sederhana tentang beberapa tips tentang menggunakan array JavaScript. Kami akan menggunakan metode yang berbeda untuk menggabungkan/menggabungkan dua array JS, serta membahas keuntungan/kerugian dari masing -masing metode.
Mari kita pertimbangkan situasi berikut terlebih dahulu:
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9]; var b = ["foo", "bar", "baz", "bam", "roti", "menyenangkan"];
Jelas, hasil kombinasi paling sederhana harus:
[1, 2, 3, 4, 5, 6, 7, 8, 9, "foo", "bar", "baz", "bam" "roti", "menyenangkan"]
concat (..)
Ini adalah praktik yang paling umum:
var c = a.concat (b); a; // [1,2,3,4,5,6,7,8,9] b; // ["foo", "bar", "baz", "bam", "bun", "fun"] c; // [1,2,3,4,5,6,7,8,9, "foo", "bar", "baz", "bam", "roti", "menyenangkan"]
Seperti yang Anda lihat, C adalah array baru yang mewakili kombinasi dua array A dan B dan menjaga A dan B invarian. Sederhana?
Tetapi jika A memiliki 10.000 elemen dan B memiliki 10.000 elemen? C akan memiliki 20.000 elemen, sehingga penggunaan memori A dan B akan berlipat ganda.
"Tidak masalah!" Anda berkata. Biarkan mereka dikumpulkan, atur a dan b ke nol, masalahnya terpecahkan!
a = b = null; // 'a' dan 'b' didaur ulang
hehe. Untuk susunan kecil dengan hanya beberapa elemen, ini baik -baik saja. Tetapi untuk array besar, atau sistem dengan memori terbatas, proses ini perlu diulang sering, sebenarnya memiliki banyak perbaikan.
Penyisipan Loop
Oke, mari kita salin konten satu array ke yang lain, menggunakan: array#push (..)
// `b` ke` a`for (var i = 0; i <b.length; i ++) {a.push (b [i]);} a; // [1,2,3,4,5,6,7,8,9, "foo", "bar", "baz", "bam", "bun", "fun"] b = null;Sekarang, array A memiliki isi array b.
Tampaknya ada jejak memori yang lebih baik.
Tapi bagaimana jika array A lebih kecil? Untuk alasan memori dan kecepatan, Anda mungkin ingin menempatkan A yang lebih kecil di depan B,. Tidak masalah, ubah saja dorong (..) menjadi unshift (..):
// `a` ke` b`: for (var i = a.length-1; i> = 0; i--) {b.unshift (a [i]);} b; // [1,2,3,4,5,6,7,8,9, "foo", "bar", "baz", "bam", "roti", "menyenangkan"]Keterampilan fungsional
Namun, loop untuk memang jelek dan sulit dipertahankan. Bisakah kita melakukan yang lebih baik?
Ini adalah upaya pertama kami, menggunakan array#redukir:
// `b` ke` a`: a = b.reduce (function (coll, item) {coll.push (item); return coll;}, a); a; // [1,2,3,4,5,6,7,8,9, "foo", "bar", "baz", "bam", "bun", "fun"] // atau `a` menjadi` b`: b = a.reduceright (function (coll, item) {coll.unshift (item); return coll; b) b) b) b) b) b) b) b) b) b) b), b) b) b) b) b) b) {coll.unshift (item); return coll;}, b) B) // [1,2,3,4,5,6,7,8,9, "foo", "bar", "baz", "bam", "roti", "menyenangkan"]Array#redukir (..) dan array#reduceright (..) bagus, tetapi mereka sedikit canggung. Fungsi panah ES6 => akan mengurangi jumlah kode, tetapi masih membutuhkan fungsi, dan setiap elemen perlu dipanggil sekali, yang tidak sempurna.
Jadi bagaimana dengan ini:
// `b` ke` a`: a.push.Apply (a, b); a; // [1,2,3,4,5,6,7,8,9, "foo", "bar", "baz", "bam", "bun", "fun"] // atau `a` menjadi` b`: b.unshift.Apply (b, a); b; // [1,2,3,4,5,6,7,8,9, "foo", "bar", "baz", "bam", "roti", "menyenangkan"]
Apakah ini tempat yang jauh lebih baik? Terutama karena metode unshift (..) tidak perlu khawatir tentang penyortiran terbalik sebelumnya di sini. Operasi pidato ES6 akan lebih indah: a.push (... b) atau b.unshift (... a
Batas panjang maksimum untuk array
Masalah utama pertama adalah bahwa penggunaan memori ganda (hanya sementara tentu saja!) Pada dasarnya adalah menyalin elemen ke dalam tumpukan melalui panggilan fungsi. Selain itu, mesin JS yang berbeda memiliki batasan pada panjang data salinan.
Jadi, jika array memiliki sejuta elemen, Anda pasti akan keluar dari batas dorongan (...) atau tidak bergetar (...) memungkinkan tumpukan panggilan. Sayangnya, itu akan melakukan pekerjaan yang baik dalam menangani ribuan elemen, tetapi Anda harus berhati -hati untuk tidak melebihi batas panjang yang wajar.
Catatan: Anda dapat mencoba Splice (...), yang memiliki masalah yang sama dengan Push (...) dan Unshift (...).
Ada cara untuk menghindari batas panjang maksimum ini.
fungsi gabungan (a, b) {var len = a.length; untuk (var i = 0; i <len; i = i+5000) {b.unshift.Apply (b, a.slice (i, i+5000)); }}Tunggu, keterbacaan kami telah mundur. Sama seperti itu, itu mungkin menjadi lebih buruk dan lebih buruk.
Di atas adalah semua tentang artikel ini, saya harap akan sangat membantu bagi semua orang untuk mempelajari pemrograman JavaScript.