Apa perbedaan antara menggunakan yang delete
operator yang pada elemen array sebagai lawan menggunakan satu Array.splice
metode ?
Sebagai contoh:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
Mengapa bahkan memiliki metode sambungan jika saya dapat menghapus elemen array seperti saya dapat dengan objek?
javascript
arrays
array-splice
delete-operator
lYriCAsSH
sumber
sumber
.splice
dalam loop, lihat pertanyaan ini: Hapus dari array di javascript .delete
danArray.prototype.splice
.Jawaban:
delete
akan menghapus properti objek, tetapi tidak akan mengindeks ulang array atau memperbarui panjangnya. Ini membuatnya tampak seolah-olah tidak terdefinisi:Perhatikan bahwa sebenarnya tidak disetel ke nilai
undefined
, melainkan properti dihapus dari array, membuatnya tampak tidak terdefinisi. Alat dev Chrome membuat perbedaan ini jelas dengan mencetakempty
saat mencatat array.myArray.splice(start, deleteCount)
sebenarnya menghapus elemen, mengindeks ulang array, dan mengubah panjangnya.sumber
delete
tidak menghapus elemen, tetapi tidak mengindeks ulang array atau memperbarui panjangnya (yang sudah tersirat oleh sebelumnya karena panjang selalu indeks tertinggi +1).delete myArray[0]
sintaks yang mengatakan " Diharapkan operator dan bukannya melihat 'hapus'. "splice
Disarankan menggunakan.delete myArray[0]
danmyArray[0] = undefined
. Dalam kasus sebelumnya, properti dihapus dari objek array sepenuhnya. Dalam kasus kedua, properti tetap, dengan nilainyaundefined
.empty
alih-alihundefined
untuk meningkatkan perbedaan antara elemen array yang benar-benar dihapus (atau tidak diinisialisasi) versus elemen yang memiliki nilai sebenarnyaundefined
. Perhatikan bahwa saat saya mengatakan ini, maksud saya hanya menampilkan sebagaiempty
, dan tidak merujuk ke nilai nyata yang disebutempty
(yang tidak ada).Metode Array.remove ()
John Resig , pencipta jQuery menciptakan
Array.remove
metode yang sangat berguna yang selalu saya gunakan dalam proyek saya.dan inilah beberapa contoh cara penggunaannya:
Situs web John
sumber
[1,2,3].slice('1'); // =[2,3]
), jadi lebih aman untuk mengubahnya kevar rest = this.slice(parseInt(to || from) + 1 || this.length);
this.push.apply(this, rest)
, lalu mengembalikan nilai yang dikembalikanfor(var i in array)
siklus. Saya telah menghapusnya dan menggunakan sambungan.Karena delete hanya menghapus objek dari elemen dalam array, panjang array tidak akan berubah. Splice menghapus objek dan mempersingkat array.
Kode berikut akan menampilkan "a", "b", "undefined", "d"
Sedangkan ini akan menampilkan "a", "b", "d"
sumber
myArray.splice(2,1)
Saya menemukan pertanyaan ini sambil mencoba memahami cara menghapus setiap kemunculan elemen dari Array. Berikut adalah perbandingan dari
splice
dandelete
untuk menghapus setiap'c'
dariitems
Array.sumber
Dari Core JavaScript 1.5 Referensi> Operator> Operator Khusus> hapus Operator :
sumber
splice
akan bekerja dengan indeks numerik.sedangkan
delete
dapat digunakan terhadap jenis indeks lainnya ..contoh:
sumber
Mungkin juga perlu disebutkan bahwa sambungan hanya berfungsi pada array. (Properti objek tidak dapat diandalkan untuk mengikuti urutan yang konsisten.)
Untuk menghapus pasangan nilai kunci dari suatu objek, hapus sebenarnya yang Anda inginkan:
sumber
hapus sambatan Vs
ketika Anda menghapus item dari sebuah array
ketika Anda sambatan
dalam kasus delete tersebut elemen dihapus namun indeks tetap kosong
sementara dalam kasus elemen sambatan dihapus dan indeks elemen sisanya dikurangi sesuai
sumber
Seperti yang dinyatakan berkali-kali di atas, menggunakan
splice()
sepertinya cocok. Dokumentasi di Mozilla:sumber
hapus tindakan seperti situasi dunia nyata, itu hanya menghapus item, tetapi panjang array tetap sama:
contoh dari terminal simpul:
Berikut adalah fungsi untuk menghapus item array dengan indeks, menggunakan slice () , dibutuhkan arr sebagai argumen pertama, dan indeks anggota yang ingin Anda hapus sebagai argumen kedua. Seperti yang Anda lihat, itu benar-benar menghapus anggota array, dan akan mengurangi panjang array sebesar 1
Apa fungsi yang dilakukan di atas adalah mengambil semua anggota ke indeks, dan semua anggota setelah indeks, dan menggabungkan mereka bersama-sama, dan mengembalikan hasilnya.
Berikut adalah contoh menggunakan fungsi di atas sebagai modul simpul, melihat terminal akan berguna:
harap dicatat bahwa ini tidak akan bekerja satu array dengan dupes di dalamnya, karena indexOf ("c") hanya akan mendapatkan kejadian pertama, dan hanya memisahkan dan menghapus "c" pertama yang ditemukannya.
sumber
Jika Anda ingin mengulangi array besar dan menghapus elemen secara selektif, akan mahal untuk memanggil splice () untuk setiap delete karena splice () harus mengindeks ulang elemen berikutnya setiap kali. Karena array asosiatif dalam Javascript, akan lebih efisien untuk menghapus elemen individu kemudian indeks ulang array setelahnya.
Anda dapat melakukannya dengan membangun array baru. misalnya
Tapi saya tidak berpikir Anda dapat memodifikasi nilai-nilai kunci dalam array asli, yang akan lebih efisien - sepertinya Anda harus membuat array baru.
Perhatikan bahwa Anda tidak perlu memeriksa entri "tidak ditentukan" karena tidak benar-benar ada dan untuk loop tidak mengembalikannya. Ini adalah artefak dari pencetakan array yang menampilkannya sebagai tidak terdefinisi. Tampaknya tidak ada dalam memori.
Akan lebih baik jika Anda bisa menggunakan sesuatu seperti slice () yang akan lebih cepat, tetapi tidak mengindeks ulang. Adakah yang tahu cara yang lebih baik?
Sebenarnya, Anda mungkin dapat melakukannya di tempat sebagai berikut yang mungkin lebih efisien, dari segi kinerja:
sumber
Anda dapat menggunakan sesuatu seperti ini
sumber
slice
jika Anda berasal dari latar belakang fungsional (meskipun mungkin kurang efisien).Kenapa tidak disaring saja? Saya pikir ini adalah cara yang paling jelas untuk mempertimbangkan array di js.
sumber
delete
atauslice
bagi saya.Perbedaannya dapat dilihat dengan mencatat panjang setiap larik setelah
delete
operator dansplice()
metode diterapkan. Sebagai contoh:hapus operator
The
delete
Operator menghilangkan elemen dari array, tetapi "placeholder" elemen masih ada.oak
telah dihapus tetapi masih membutuhkan ruang dalam array. Karena itu, panjang array tetap 5.metode splice ()
The
splice()
metode yang sama sekali menghilangkan nilai target dan yang "placeholder" juga.oak
telah dihapus serta ruang yang digunakan untuk menempati dalam array. Panjang array sekarang 4.sumber
contoh:
pisang dihapus dan panjang array = 2
sumber
Mereka adalah hal-hal berbeda yang memiliki tujuan berbeda.
splice
spesifik array dan, ketika digunakan untuk menghapus, menghapus entri dari array dan memindahkan semua entri sebelumnya ke atas untuk mengisi celah. (Ini juga dapat digunakan untuk memasukkan entri, atau keduanya pada saat yang bersamaan.)splice
Akan mengubahlength
array (dengan asumsi itu bukan panggilan no-op:)theArray.splice(x, 0)
.delete
tidak spesifik-array; itu dirancang untuk digunakan pada objek: Ini menghapus properti (pasangan kunci / nilai) dari objek tempat Anda menggunakannya. Ini hanya berlaku untuk array karena array standar (misalnya, non-mengetik) dalam JavaScript tidak benar-benar sama sekali array *, mereka objek dengan penanganan khusus untuk properti tertentu, seperti yang namanya "indeks array" (yang merupakan didefinisikan sebagai nama string "... yang nilai numeriknyai
dalam kisaran+0 ≤ i < 2^32-1
") danlength
. Ketika Anda menggunakandelete
untuk menghapus entri array, yang dilakukannya hanyalah menghapus entri; itu tidak memindahkan entri lain yang mengikutinya untuk mengisi celah, dan array menjadi "jarang" (ada beberapa entri yang hilang seluruhnya). Itu tidak berpengaruhlength
.Beberapa jawaban saat ini untuk pertanyaan ini salah menyatakan bahwa menggunakan
delete
"set entri keundefined
". Itu tidak benar. Ini menghapus entri (properti) sepenuhnya, meninggalkan celah.Mari kita gunakan beberapa kode untuk menggambarkan perbedaan:
* (itu posting di blog kecil saya yang anemia)
sumber
Saat ini ada dua cara untuk melakukan ini
menggunakan sambatan ()
arrayObject.splice(index, 1);
menggunakan delete
delete arrayObject[index];
Tapi saya selalu menyarankan untuk menggunakan sambatan untuk objek array dan menghapus atribut objek karena menghapus tidak memperbarui panjang array.
sumber
OK, bayangkan kita memiliki array ini di bawah ini:
Mari kita lakukan hapus dulu:
dan inilah hasilnya:
kosong! dan mari kita dapatkan:
Jadi artinya hanya nilai yang dihapus dan tidak terdefinisi sekarang, jadi panjangnya sama, juga akan mengembalikan nilai sebenarnya ...
Mari atur ulang array kita dan lakukan ini dengan sambungan kali ini:
dan inilah hasilnya kali ini:
Seperti yang Anda lihat panjang array berubah dan
arr[1]
adalah 3 sekarang ...Juga ini akan mengembalikan item yang dihapus dalam Array yang
[3]
dalam hal ini ...sumber
Yang lain sudah dibandingkan
delete
dengansplice
.Perbandingan menarik lainnya adalah
delete
versusundefined
: item array yang dihapus menggunakan lebih sedikit memori daripada yang baru saja diaturundefined
;Misalnya, kode ini tidak akan selesai:
Ini menghasilkan kesalahan ini:
Jadi, seperti yang Anda lihat
undefined
sebenarnya membutuhkan memori tumpukan.Namun, jika Anda juga
delete
item-ary (alih-alih hanya mengaturnyaundefined
), kode perlahan-lahan akan selesai:Ini adalah contoh ekstrem, tetapi mereka menunjukkan
delete
bahwa saya belum pernah melihat orang menyebutkan di mana pun.sumber
Jika Anda memiliki array kecil, Anda dapat menggunakan
filter
:sumber
Cara termudah mungkin
Semoga ini membantu. Referensi: https://lodash.com/docs#compact
sumber
compact
... tidak perlu untuk penginapan. CobamyArray.filter(function(n){return n;})
Bagi yang ingin menggunakan Lodash dapat menggunakan:
myArray = _.without(myArray, itemToRemove)
Atau seperti yang saya gunakan di Angular2
sumber
Hapus elemen dari yang terakhir
Hapus elemen dari dulu
Hapus dari tengah
Hapus satu elemen dari yang terakhir
Hapus dengan menggunakan nomor indeks array
sumber
Jika elemen yang diinginkan untuk dihapus ada di tengah (katakanlah kami ingin menghapus 'c', yang indeksnya adalah 1), Anda dapat menggunakan:
sumber
IndexOf
menerima juga tipe referensi. Misalkan skenario berikut:Berbeda:
sumber
// hasil: myArray = ['b', 'c', 'd'];
sumber