Saya perlu menambahkan atau menambahkan elemen di awal array.
Misalnya, jika array saya terlihat seperti di bawah ini:
[23, 45, 12, 67]
Dan respon dari panggilan AJAX saya adalah 34
, saya ingin array yang diperbarui menjadi seperti berikut:
[34, 23, 45, 12, 67]
Saat ini saya berencana untuk melakukannya seperti ini:
var newArray = [];
newArray.push(response);
for (var i = 0; i < theArray.length; i++) {
newArray.push(theArray[i]);
}
theArray = newArray;
delete newArray;
Apakah ada cara yang lebih baik untuk melakukan ini? Apakah Javascript memiliki fungsi bawaan yang melakukan ini?
Kompleksitas metode saya O(n)
dan akan sangat menarik untuk melihat implementasi yang lebih baik.
javascript
arrays
Bulan
sumber
sumber
push
pernyataan yang diikuti oleh panggilanreverse
, alih-alih meneleponunshift
sepanjang waktu.Jawaban:
Gunakan
unshift
. Itu sepertipush
, kecuali itu menambahkan elemen ke awal array bukan akhir.unshift
/push
- tambahkan elemen ke awal / akhir arrayshift
/pop
- hapus dan kembalikan elemen pertama / terakhir dari sebuah arrayDiagram sederhana ...
dan bagan:
Lihatlah dokumentasi Array MDN . Sebenarnya setiap bahasa yang memiliki kemampuan untuk mendorong / memunculkan elemen dari sebuah array juga akan memiliki kemampuan untuk melepaskan / menggeser (kadang-kadang disebut
push_front
/pop_front
) elemen, Anda seharusnya tidak harus mengimplementasikannya sendiri.Seperti yang ditunjukkan dalam komentar, jika Anda ingin menghindari mutasi array asli Anda, Anda dapat menggunakan
concat
, yang menggabungkan dua array atau lebih secara bersamaan. Anda dapat menggunakan ini untuk secara fungsional mendorong elemen tunggal ke depan atau belakang array yang ada; untuk melakukannya, Anda perlu mengubah elemen baru menjadi array elemen tunggal:concat
juga dapat menambahkan item. Argumen untukconcat
dapat dari jenis apa pun; mereka secara implisit dibungkus dalam array elemen tunggal, jika mereka belum menjadi array:sumber
concat
mungkin lebih disukai karena mengembalikan array baru. Sangat berguna untuk merantai.[thingToInsertToFront].concat(originalArray).reduce(fn).reverse().map(fn)
dll ... Jika Anda menggunakanunshift
, Anda tidak dapat melakukan rantai itu karena yang Anda dapatkan hanyalah panjangnya.sumber
Dengan ES6, gunakan operator spread
...
:DEMO
sumber
concat
.Cara lain untuk melakukannya
concat
Perbedaan antara
concat
danunshift
adalah yangconcat
mengembalikan array baru. Performa di antara mereka dapat ditemukan di sini .Inilah hasil tesnya
sumber
unshift
25.510 ± 3.18% 99% lebih lambatconcat
: 2.436.894 ± 3.39% tercepatCheatsheet Cepat:
Istilah shift / unshift dan push / pop bisa sedikit membingungkan, setidaknya untuk orang-orang yang mungkin tidak terbiasa dengan pemrograman dalam C.
Jika Anda tidak terbiasa dengan istilah itu, berikut ini adalah terjemahan cepat dari istilah-istilah alternatif, yang mungkin lebih mudah diingat:
sumber
Anda memiliki sebuah array:
var arr = [23, 45, 12, 67];
Untuk menambahkan item ke awal, Anda ingin menggunakan
splice
:sumber
unshift
50% lebih cepat (tapi sebagian besar lebih mudah dibaca)Tanpa bermutasi
Sebenarnya, semua
unshift
/push
danshift
/pop
mutasi array asal.The
unshift
/push
menambahkan item ke array ada dari mulai / akhir danshift
/pop
menghapus item dari awal / akhir array.Tetapi ada beberapa cara untuk menambahkan item ke array tanpa mutasi. hasilnya adalah array baru, untuk menambahkan ke akhir array gunakan kode di bawah ini:
Untuk menambahkan untuk memulai array asli gunakan kode di bawah ini:
Dengan cara di atas, Anda menambah awal / akhir array tanpa mutasi.
sumber
slice
fungsi pada akhiroriginArray
untuk mencegahnya dari berubah-ubah.Menggunakan destruksi ES6: (menghindari mutasi dari array asli)
const newArr = [item, ...oldArr]
sumber
Jika Anda perlu terus-menerus memasukkan elemen di awal array, lebih cepat menggunakan
push
pernyataan yang diikuti oleh panggilanreverse
, alih-alih meneleponunshift
sepanjang waktu.Tes patokan: http://jsben.ch/kLIYf
sumber
Menggunakan
splice
kami menyisipkan elemen ke array di awal:sumber