Katakanlah saya membuat objek sebagai berikut:
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
Apa cara terbaik untuk menghapus properti regex
agar berakhir dengan yang baru myObject
sebagai berikut?
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI"
};
javascript
javascript-objects
Johnstok
sumber
sumber
delete
akan menjadi pilihan paling lambat karena ini merupakan operasi yang sebenarnya daripada dua lainnya yang hanya tugas sederhana. Tetapi inti masalahnya adalah bahwa menempatkan properti kenull
atauundefined
tidak benar-benar menghapus properti dari objek, tetapi sebaliknya menetapkan properti itu sama dengan nilai konstan tertentu. (Jawaban di bawah ini memberikan alasan mengapa ini merupakan perbedaan yang signifikan.)Jawaban:
Seperti ini:
Demo
Bagi siapa pun yang tertarik untuk membaca lebih lanjut tentang hal itu, kangax pengguna Stack Overflow telah menulis posting blog yang sangat mendalam tentang
delete
pernyataan di blog mereka, Memahami hapus . Sangat direkomendasikan.sumber
var x = {a : 'A', b : 'B'};
Bandingkan:delete x.a; typeof x.a; /* "undefined" */ x.hasOwnProperty('a'); /* false */
kex.b = undefined; typeof x.b; /* "undefined" */; x.hasOwnProperty('b'); /* true */
Objek dalam JavaScript dapat dianggap sebagai peta antara kunci dan nilai. The
delete
operator yang digunakan untuk menghapus kunci ini, lebih dikenal sebagai properti obyek, satu per satu.The
delete
Operator tidak langsung memori bebas, dan hal itu berbeda dari hanya menetapkan nilai darinull
atauundefined
ke properti, dalam bahwa properti itu sendiri akan dihapus dari objek. Perhatikan bahwa jika nilai properti yang dihapus adalah tipe referensi (objek), dan bagian lain dari program Anda masih memegang referensi ke objek itu, maka objek itu, tentu saja, tidak akan menjadi sampah yang dikumpulkan sampai semua referensi ke sana memiliki lenyap.delete
hanya akan bekerja pada properti yang deskriptor menandainya sebagai dapat dikonfigurasi.sumber
Ini berfungsi di Firefox dan Internet Explorer, dan saya pikir itu berfungsi di semua yang lain.
sumber
The
delete
operator yang digunakan untuk menghapus sifat dari benda-benda.Perhatikan bahwa, untuk array, ini tidak sama dengan menghapus elemen . Untuk menghapus elemen dari array, gunakan
Array#splice
atauArray#pop
. Sebagai contoh:Detail
delete
dalam JavaScript memiliki fungsi yang berbeda dengan kata kunci dalam C dan C ++: tidak secara langsung membebaskan memori. Sebaliknya, tujuan utamanya adalah untuk menghapus properti dari objek.Untuk array, menghapus properti yang berkaitan dengan indeks, membuat array jarang (mis. Array dengan "lubang" di dalamnya). Sebagian besar browser menyatakan indeks array yang hilang ini sebagai "kosong".
Perhatikan bahwa
delete
tidak pindaharray[3]
kearray[2]
.Fungsi bawaan yang berbeda di JavaScript menangani array jarang.
for...in
akan melewatkan indeks kosong sepenuhnya.for
Loop tradisional akan kembaliundefined
untuk nilai pada indeks.Setiap metode yang menggunakan
Symbol.iterator
akan mengembalikanundefined
nilai pada indeks.forEach
,map
danreduce
hanya akan melewatkan indeks yang hilang.Jadi,
delete
operator tidak boleh digunakan untuk kasus umum menghapus elemen dari array. Array memiliki metode khusus untuk menghapus elemen dan mengalokasikan kembali memori:Array#splice()
danArray#pop
.Array # splice (mulai [, deleteCount [, item1 [, item2 [, ...]]]])
Array#splice
bermutasi array, dan mengembalikan indeks yang dihapus.deleteCount
elemen dihapus dari indeksstart
, danitem1, item2... itemN
dimasukkan ke dalam array dari indeksstart
. JikadeleteCount
dihilangkan maka elemen dari startIndex dihapus ke akhir array.Ada juga bernama sama, tetapi berbeda, fungsi pada
Array.prototype
:Array#slice
.Array # slice ([begin [, end]])
Array#slice
tidak merusak, dan mengembalikan array baru yang berisi indeks yang ditunjukkan daristart
keend
. Jikaend
dibiarkan tidak ditentukan, defaultnya ke akhir array. Jikaend
positif, ini menentukan indeks non-inklusif berbasis nol untuk berhenti. Jikaend
negatif, itu menentukan indeks untuk berhenti dengan menghitung kembali dari akhir array (mis. -1 akan menghilangkan indeks akhir). Jikaend <= start
, hasilnya adalah array kosong.Array # pop
Array#pop
menghapus elemen terakhir dari array, dan mengembalikan elemen itu. Operasi ini mengubah panjang array.sumber
delete
dan membuat fungsi Pengumpulan Sampah untuk membersihkannya.splice
dalam suntingan Anda, tetapiremove
seharusnyaArray.prototype.remove = function(index) { this.splice(index, 1); };
Pertanyaan lama, jawaban modern. Menggunakan objek destructive, fitur ECMAScript 6 , sesederhana:
Atau dengan sampel pertanyaan:
Anda dapat melihatnya beraksi di editor uji coba Babel.
Edit:
Untuk menetapkan kembali ke variabel yang sama, gunakan
let
:sumber
regex
Anda juga bisa menetapkan ke variabel lain, misalnya_
, apa yang digunakan dalam bahasa seperti Go untuk membuang hasilnya:const { regex: _, ...newObject } = myObject;
.const { [key], ...newObject } = myObject;
tetapi tidak, jadi saya tidak berpikir itu mungkin dengan merusak.freeze()
'd danseal()
' d, Anda tidak bisa hanyadelete
properti. Jadi ini adalah alternatif yang bagus. Meskipun dalam kebanyakan kasus, mungkin tidak masuk akal untuk menghapus properti dari objek yang dibekukan / disegel, mengingat seluruh intinya adalah untuk membuat jaminan tertentu tentang struktur data Anda, yang pola ini akan merusak. Untuk kasus-kasus di mana Anda perlu secara non-destruktif menipu objek tetapi tanpa beberapa propertinya, ini sempurnaSintaks Penyebaran (ES6)
Untuk siapa pun yang membutuhkannya ...
Untuk menyelesaikan @Koen jawaban di utas ini, jika Anda ingin menghapus variabel dinamis menggunakan sintaksis spread, Anda dapat melakukannya seperti:
*
foo
akan menjadi variabel baru dengan nilaia
(yaitu 1).JAWABAN YANG DIPERPANJANG 😇
Ada beberapa cara umum untuk menghapus properti dari objek.
Masing-masing memiliki kelebihan dan kekurangannya sendiri ( periksa perbandingan kinerja ini ):
Hapus Operator
Dapat dibaca dan pendek, namun, itu mungkin bukan pilihan terbaik jika Anda beroperasi pada sejumlah besar objek karena kinerjanya tidak dioptimalkan.
Penugasan Kembali
Lebih dari 2X lebih cepat dari
delete
, namun propertitidakdihapus dan dapat diulang.Penyebar Operator Operator
ini
ES6
memungkinkan kami untuk mengembalikan objek baru, tidak termasuk properti apa pun, tanpa mengubah objek yang ada. The downside adalah bahwa ia memiliki kinerja yang lebih buruk di atas dan tidak disarankan untuk digunakan ketika Anda harus menghapus banyak properti sekaligus.sumber
Alternatif lain adalah dengan menggunakan perpustakaan Underscore.js .
Perhatikan bahwa
_.pick()
dan_.omit()
keduanya mengembalikan salinan objek dan tidak secara langsung memodifikasi objek asli. Menugaskan hasil ke objek asli harus melakukan trik (tidak ditampilkan).Referensi: tautan _.pick (objek, * kunci)
Kembali salinan objek, difilter untuk hanya memiliki nilai untuk kunci yang masuk daftar putih (atau array kunci yang valid).
Referensi: tautan _.omit (objek, * kunci)
Kembalikan salinan objek, disaring untuk menghilangkan kunci daftar hitam (atau array kunci).
Untuk array,
_.filter()
dan_.reject()
dapat digunakan dengan cara yang sama.sumber
_.omit(collection, key.toString())
delete obj[prop]
~ 100x lebih lambat dariobj[prop] = undefined
.Istilah yang Anda gunakan dalam judul pertanyaan Anda
Remove a property from a JavaScript object
, dapat diartikan dengan beberapa cara berbeda. Yang satu adalah menghapusnya untuk seluruh memori dan daftar kunci objek atau yang lain hanya untuk menghapusnya dari objek Anda. Seperti yang telah disebutkan dalam beberapa jawaban lain,delete
kata kunci adalah bagian utama. Katakanlah Anda memiliki objek seperti:Jika kamu melakukan:
hasilnya adalah:
Anda dapat menghapus kunci spesifik itu dari kunci objek Anda seperti:
Maka kunci obyek yang Anda gunakan
Object.keys(myJSONObject)
adalah:Tetapi intinya adalah jika Anda peduli dengan memori dan Anda ingin seluruh objek dihapus dari memori, disarankan untuk mengaturnya menjadi nol sebelum Anda menghapus kunci:
Poin penting lainnya di sini adalah berhati-hati tentang referensi Anda yang lain ke objek yang sama. Misalnya, jika Anda membuat variabel seperti:
Atau tambahkan sebagai pointer baru ke objek lain seperti:
Kemudian bahkan jika Anda menghapusnya dari objek Anda
myJSONObject
, objek tertentu itu tidak akan dihapus dari memori, karenaregex
variabel danmyOtherObject["regex"]
masih memiliki nilainya. Lalu bagaimana kita bisa menghapus objek dari memori?Jawabannya adalah untuk menghapus semua referensi yang Anda miliki dalam kode Anda, menunjuk ke objek itu dan juga tidak menggunakan
var
pernyataan untuk membuat referensi baru ke objek itu . Poin terakhir tentangvar
pernyataan ini, adalah salah satu masalah paling krusial yang biasanya kita hadapi, karena menggunakanvar
pernyataan akan mencegah objek yang dibuat agar tidak dihapus.Yang berarti dalam hal ini Anda tidak akan dapat menghapus objek itu karena Anda telah membuat
regex
variabel melaluivar
pernyataan, dan jika Anda melakukannya:Hasilnya adalah
false
, yang berarti bahwa pernyataan penghapusan Anda belum dieksekusi seperti yang Anda harapkan. Tetapi jika Anda belum membuat variabel itu sebelumnya, dan Anda hanya memilikimyOtherObject["regex"]
referensi terakhir yang ada, Anda bisa melakukan ini hanya dengan menghapusnya seperti:Dengan kata lain, objek JavaScript terbunuh segera setelah tidak ada referensi tersisa di kode Anda yang menunjuk ke objek itu.
Pembaruan: Terima kasih kepada @ AgentME:
Untuk mendapatkan info lebih lanjut tentang
Object.seal
: Object.seal ()sumber
myJSONObject.regex
nilai adalah string dan Anda menetapkannya ke beberapa objek lain, objek lain memiliki salinan nilai ini.ECMAScript 2015 (atau ES6) hadir dengan objek Reflect bawaan . Dimungkinkan untuk menghapus properti objek dengan memanggil fungsi Reflect.deleteProperty () dengan objek target dan kunci properti sebagai parameter:
yang setara dengan:
Tetapi jika properti objek tidak dapat dikonfigurasi itu tidak dapat dihapus baik dengan fungsi deleteProperty maupun operator hapus:
Object.freeze () membuat semua properti objek tidak dapat dikonfigurasi (selain hal-hal lain).
deleteProperty
fungsi (serta menghapus operator ) kembalifalse
ketika mencoba untuk menghapus salah satu propertinya. Jika properti dapat dikonfigurasi, ia kembalitrue
, bahkan jika properti tidak ada.Perbedaan antara
delete
dandeleteProperty
saat menggunakan mode ketat:sumber
apply
,call
,bind
fungsi ...Misalkan Anda memiliki objek yang terlihat seperti ini:
Menghapus properti objek
Jika Anda ingin menggunakan seluruh
staff
array, cara yang tepat untuk melakukan ini, adalah dengan melakukan ini:Atau, Anda juga bisa melakukan ini:
Demikian pula, menghapus seluruh susunan siswa akan dilakukan dengan memanggil
delete Hogwarts.students;
ataudelete Hogwarts['students'];
.Menghapus indeks array
Sekarang, jika Anda ingin menghapus satu anggota staf atau siswa, prosedurnya sedikit berbeda, karena kedua properti adalah array itu sendiri.
Jika Anda mengetahui indeks anggota staf Anda, Anda bisa melakukan ini:
Jika Anda tidak tahu indeksnya, Anda juga harus melakukan pencarian indeks:
Catatan
Meskipun secara teknis Anda dapat menggunakan
delete
untuk array, menggunakannya akan menghasilkan hasil yang salah ketika memanggil misalnyaHogwarts.staff.length
nanti. Dengan kata lain,delete
akan menghapus elemen, tetapi tidak akan memperbarui nilailength
properti. Menggunakandelete
juga akan mengacaukan pengindeksan Anda.Jadi, saat menghapus nilai dari suatu objek, selalu pertimbangkan dulu apakah Anda berurusan dengan properti objek atau apakah Anda berurusan dengan nilai array, dan pilih strategi yang tepat berdasarkan itu.
Jika Anda ingin bereksperimen dengan ini, Anda dapat menggunakan Fiddle ini sebagai titik awal.
sumber
splice
array bukandelete
.delete
seharusnya tidak boleh apa-apa. Inilah yangsplice
dicari OP.delete
harus digunakan untuk properti objek dansplice
elemen array.delete
pada array, akan lebih bijaksana untuk tidak membuat kode yang berpusat di sekitarnya sama sekali.Menggunakan ES6:
(Destrukturisasi + operator Spread)
sumber
Saya pribadi menggunakan Underscore.js atau Lodash untuk manipulasi objek dan array:
sumber
The Operator delete adalah cara terbaik untuk melakukannya.
Contoh langsung untuk ditampilkan:
sumber
delete
operator itu sehat dalam hal pengumpulan sampah , bisa tiba - tiba lambat , tidak sedikit untuk alasan yang sama.Untuk mengkloning objek tanpa properti:
Sebagai contoh:
Dan kita perlu menghapus 'a'.
1. Dengan kunci prop eksplisit:
2. Dengan kunci prop variabel:
3.Fungsi panah dingin 😎:
4. Untuk beberapa properti
Pemakaian
Atau
sumber
Menggunakan metode delete adalah cara terbaik untuk melakukan itu, sesuai deskripsi MDN, operator delete menghapus properti dari objek. Jadi Anda cukup menulis:
Cuplikan berikut memberikan contoh sederhana lain:
Untuk info lebih lanjut tentang dan melihat lebih banyak contoh, kunjungi tautan di bawah:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
sumber
Solusi lain, menggunakan
Array#reduce
.Namun, itu akan bermutasi objek asli. Jika Anda ingin membuat objek baru tanpa kunci yang ditentukan, cukup tetapkan fungsi pengurangan ke variabel baru, misalnya:
(ES6)
sumber
Posting ini sangat lama dan saya merasa sangat membantu jadi saya memutuskan untuk berbagi fungsi tidak disetel yang saya tulis seandainya ada orang lain yang melihat posting ini dan berpikir mengapa itu tidak sesederhana seperti pada fungsi PHP tidak disetel.
Alasan untuk menulis
unset
fungsi baru ini , adalah untuk menjaga indeks semua variabel lain dalam hash_map ini. Lihatlah contoh berikut, dan lihat bagaimana indeks "test2" tidak berubah setelah menghapus nilai dari hash_map.sumber
Ada banyak jawaban bagus di sini, tetapi saya hanya ingin mengatakan bahwa ketika menggunakan delete untuk menghapus properti di JavaScript, sering kali bijak untuk memeriksa dulu apakah properti itu ada untuk mencegah kesalahan.
Misalnya
Karena sifat dinamis JavaScript sering ada kasus di mana Anda tidak tahu apakah properti itu ada atau tidak. Memeriksa apakah obj ada sebelum && juga memastikan Anda tidak melakukan kesalahan karena memanggil fungsi hasOwnProperty () pada objek yang tidak ditentukan.
Maaf jika ini tidak menambah use case khusus Anda, tetapi saya yakin ini adalah desain yang bagus untuk beradaptasi ketika mengelola objek dan propertinya.
sumber
delete foo.bar;
hanya melempar pengecualian jika foo falsy, atau jika Anda dalam mode ketat dan foo adalah objek dengan properti bar yang tidak dapat dikonfigurasi.Menggunakan ramda # dissoc Anda akan mendapatkan objek baru tanpa atribut
regex
:Anda juga dapat menggunakan fungsi lain untuk mencapai efek yang sama - menghilangkan, memilih, ...
sumber
Coba metode berikut. Tetapkan nilai
Object
properti keundefined
. Lalustringify
objek danparse
.sumber
JSON.parse(JSON.stringify({ ...myObject, regex: undefined }))
Jika Anda ingin menghapus properti yang bersarang dalam objek maka Anda dapat menggunakan fungsi rekursif berikut dengan path ke properti sebagai argumen kedua:
Contoh:
sumber
Anda cukup menghapus properti apa pun dari suatu objek menggunakan
delete
kata kunci.Sebagai contoh:
Untuk menghapus properti apa pun, katakanlah
key1
, gunakandelete
kata kunci seperti ini:Atau Anda juga dapat menggunakan notasi seperti array:
Ref: MDN .
sumber
Object.assign () & Object.keys () & Array.map ()
sumber
Pernyataan Dan bahwa 'hapus' sangat lambat dan patokan yang dia posting diragukan. Jadi saya melakukan tes sendiri di Chrome 59. Tampaknya 'hapus' sekitar 30 kali lebih lambat:
Perhatikan bahwa saya sengaja melakukan lebih dari satu operasi 'hapus' dalam satu siklus untuk meminimalkan efek yang disebabkan oleh operasi lain.
sumber
Pertimbangkan untuk membuat objek baru tanpa
"regex"
properti karena objek asli selalu dapat dirujuk oleh bagian lain dari program Anda. Dengan demikian Anda harus menghindari memanipulasi itu.sumber
SyntaxError: Unexpected token '...'. Expected a property name.
?Penghapusan Properti dalam JavaScript
Ada banyak opsi berbeda yang disajikan pada halaman ini, bukan karena sebagian besar pilihannya salah — atau karena jawabannya adalah duplikat — tetapi karena teknik yang tepat tergantung pada situasi Anda dan tujuan tugas yang Anda dan / atau Anda lakukan. Tim berusaha untuk memenuhi. Untuk menjawab pertanyaan Anda dengan tegas, Anda perlu tahu:
Setelah keempat pertanyaan itu dijawab, pada dasarnya ada empat kategori "penghapusan properti" dalam JavaScript untuk dipilih untuk memenuhi tujuan Anda. Mereka:
Penghapusan properti objek mutatif, tidak aman
Kategori ini adalah untuk beroperasi pada objek literal atau instance objek ketika Anda ingin mempertahankan / terus menggunakan referensi asli dan tidak menggunakan prinsip-prinsip fungsional stateless dalam kode Anda. Contoh sintaks dalam kategori ini:
Kategori ini adalah kategori penghapusan properti tertua, paling mudah & paling banyak didukung. Ini mendukung
Symbol
& array indeks selain string dan berfungsi di setiap versi JavaScript kecuali untuk rilis pertama. Namun, itu mutatif yang melanggar beberapa prinsip pemrograman dan memiliki implikasi kinerja. Ini juga dapat menghasilkan pengecualian tanpa tertangkap ketika digunakan pada properti yang tidak dapat dikonfigurasi dalam mode ketat .Penghilangan properti string berbasis istirahat
Kategori ini untuk operasi pada objek objek atau array contoh dalam rasa ECMAScript yang lebih baru ketika pendekatan non-mutatif diinginkan dan Anda tidak perlu memperhitungkan kunci Simbol:
Penghapusan properti objek mutatif, aman
Kategori ini untuk operasi pada objek literal atau instance objek ketika Anda ingin mempertahankan / terus menggunakan referensi asli sambil menjaga terhadap pengecualian yang dilemparkan pada properti yang tidak dapat dikonfigurasi:
Selain itu, sementara bermutasi objek di tempat bukan stateless, Anda dapat menggunakan sifat fungsional
Reflect.deleteProperty
untuk melakukan aplikasi parsial dan teknik fungsional lainnya yang tidak mungkin dengandelete
pernyataan.Penghilangan properti string berbasis sintaksis
Kategori ini untuk operasi pada objek objek atau array contoh dalam rasa ECMAScript yang lebih baru ketika pendekatan non-mutatif diinginkan dan Anda tidak perlu memperhitungkan kunci Simbol:
Penghilangan properti berbasis perpustakaan
Kategori ini secara umum memungkinkan fleksibilitas fungsional yang lebih besar, termasuk akuntansi untuk Simbol & menghilangkan lebih dari satu properti dalam satu pernyataan:
sumber
sumber
delete myObject.regex;
.Anda dapat menggunakan destruksi ES6 dengan operator lainnya.
Properti dapat dihilangkan menggunakan Destrukturisasi dalam kombinasi dengan operator lainnya . Dalam contoh Anda, regex dirusak (diabaikan) dan sisa properti dikembalikan sebagai istirahat.
Atau Anda dapat secara dinamis mengecualikan properti seperti ini,
sumber
Kami dapat menghapus properti apa pun dari objek javascript dengan menggunakan berikut ini:
contoh:
sumber
Coba ini
sumber