Bagaimana cara menghapus semua atribut yang ada undefined
atau null
dalam objek JavaScript?
(Pertanyaan serupa dengan yang ini untuk Array)
javascript
abhijit
sumber
sumber
Jawaban:
Anda dapat mengulangi objek:
Jika Anda khawatir tentang penghapusan properti ini yang tidak menjalankan rantai proptipe objek, Anda juga dapat:
Beberapa catatan tentang nol vs tidak terdefinisi:
sumber
Menggunakan beberapa ES6 / ES2015 :
1) Satu kalimat sederhana untuk menghapus item sebaris tanpa tugas:
jsbin
2) Contoh ini telah dihapus ...
3) Contoh pertama ditulis sebagai fungsi:
jsbin
4) Fungsi ini menggunakan rekursi untuk menghapus item dari objek bersarang juga:
jsbin
4b) Ini mirip dengan 4), tetapi alih-alih memutasikan objek sumber secara langsung, ia mengembalikan objek baru.
5) Pendekatan fungsional untuk 4b) berdasarkan jawaban @ MichaelJ.Zoidl menggunakan
filter()
danreduce()
. Ini juga mengembalikan objek baru:jsbin
6) Sama seperti 4) tetapi dengan ES7 / 2016
Object.entries()
.5b) Versi fungsional lain yang menggunakan rekursi dan mengembalikan objek baru dengan ES2019
Object.fromEntries()
:7) Sama seperti 4) tetapi dalam ES5 polos :
jsbin
sumber
keys
dariobject
, jadio
dank
jelas. Tapi saya rasa ini masalah selera.Object.keys(myObj).forEach(function (key) {(myObj[key] == null) && delete myObj[key]});
Object.entries(myObj).reduce((acc, [key, val]) => { if (val) acc[key] = val; return acc; }, {})
Jika Anda menggunakan lodash atau underscore.js, berikut adalah solusi sederhana:
Ini hanya akan bekerja dengan lodash 4, pre lodash 4 atau underscore.js, gunakan
_.pick(obj, _.identity)
;sumber
_.omit(obj, _.isUndefined)
lebih baik._.isUndefined
tidak menghilangkan nulls, gunakan_.omitBy(obj, _.isNil)
untuk menghilangkan keduanyaundefined
dannull
Satu liner terpendek untuk ES6 +
Menyaring semua nilai falsy (
""
,0
,false
,null
,undefined
)Filter
null
danundefined
nilai:Saringan HANYA
null
Saringan HANYA
undefined
Solusi Rekursif: Filter
null
danundefined
Untuk Objek:
Untuk Objek dan Array:
sumber
v == null
Anda akan memeriksaundefined
dannull
.cleanEmpty
solusi recursve akan kembali objek yang kosong{}
untuk Tanggal bendaJika seseorang membutuhkan versi rekursif dari jawaban Owen (dan Eric), ini dia:
sumber
hasOwnProperty
menggunakanif(test.hasOwnProperty(i)) { ... }
JSON.stringify menghapus kunci yang tidak ditentukan.
sumber
null
diperlakukan sebagaiundefined
menggunakan fungsi penggantian, untuk info lebih lanjut lihat jawaban ini: stackoverflow.com/questions/286141/…null
nilai. Coba:let a = { b: 1, c: 0, d: false, e: null, f: undefined, g: [], h: {} }
laluconsole.log(removeUndefined(a))
. Pertanyaan tentangundefined
dannull
nilai - nilai.Anda mungkin mencari
delete
kata kunci.sumber
Solusi Lodash yang paling sederhana untuk mengembalikan objek dengan
null
danundefined
nilai yang disaring._.omitBy(obj, _.isNil)
sumber
Anda dapat menggunakan kombinasi
JSON.stringify
parameter replacer-nya, danJSON.parse
mengubahnya kembali menjadi objek. Menggunakan metode ini juga berarti penggantian dilakukan untuk semua kunci bersarang di dalam objek bersarang.Contoh Obyek
Fungsi Pengganti
Bersihkan Obyek
Contoh CodePen
sumber
Menggunakan ramda # pickBy Anda akan menghapus semua
null
,undefined
danfalse
nilainya:Seperti yang ditunjukkan @manroe, untuk menjaga agar
false
nilai tetap digunakanisNil()
:sumber
(v) => !R.isNil(v)
mungkin merupakan pilihan yang lebih baik untuk pertanyaan OP, mengingat bahwafalse
atau nilai-nilai palsu lainnya juga akan ditolak olehR.identity
Pendekatan fungsional dan abadi, tanpa
.filter
dan tanpa menciptakan lebih banyak objek dari yang dibutuhkansumber
obj[key] === undefined
keobj[key] === undefined || obj[key] === null
const omitFalsy = obj => Object.keys(obj).reduce((acc, key) => ({ ...acc, ...(obj[key] && { [key]: obj[key] }) }), {});
Anda dapat melakukan penghapusan rekursif dalam satu baris menggunakan argumen replacer json.stringify
Pemakaian:
Seperti disebutkan dalam komentar Emmanuel, teknik ini hanya berfungsi jika struktur data Anda hanya berisi tipe data yang dapat dimasukkan ke dalam format JSON (string, angka, daftar, dll).
(Jawaban ini telah diperbarui untuk menggunakan baru Operator Nullish penggabungan tergantung pada kebutuhan dukungan browser Anda mungkin ingin menggunakan fungsi ini sebagai gantinya:.
(k,v) => v!=null ? v : undefined
)sumber
NaN
ke objeknull
yang tidak dihapus.Anda dapat melakukan lebih pendek dengan
!
kondisiIngat dalam penggunaan: seperti yang diumumkan @semicolor dalam komentar: Ini juga akan menghapus properti jika nilainya berupa string kosong, false atau nol
sumber
[null, undefined].includes(r[k])
sebagai ganti!r[k]
.Solusi murni ES6 yang lebih pendek, mengubahnya menjadi array, menggunakan fungsi filter dan mengubahnya kembali ke objek. Juga mudah membuat fungsi ...
Btw. dengan ini
.length > 0
saya periksa apakah ada string / array kosong, sehingga akan menghapus kunci kosong.JS BIN https://jsbin.com/kugoyinora/edit?js,console
sumber
null
danundefined
akan lebih mudah untuk digunakanMY_OBJECT[f] != null
. Solusi Anda saat ini menghilangkan semuanya kecuali string kosong / daftar dan melempar kesalahan saat nilainyanull
filter
, akan lebih mudah dibaca.omit
, Anda perlu memeriksa obj yang ada sebelum memanggilObject.keys
:const omit = (obj, filter) => obj && Object.keys(obj).filter(key => !filter(obj[key])).reduce((acc,key) => {acc[key] = obj[key]; return acc}, {});
Jika Anda menginginkan 4 baris solusi ES7 murni:
Atau jika Anda lebih suka versi yang lebih mudah dibaca:
Ini akan mempertahankan nilai boolean dan akan membersihkan array juga. Ini juga mempertahankan objek asli dengan mengembalikan salinan yang sudah dibersihkan.
sumber
Saya memiliki skenario yang sama dalam proyek saya dan dicapai dengan menggunakan metode berikut.
Ini bekerja dengan semua tipe data, beberapa yang disebutkan di atas tidak bekerja dengan array tanggal dan kosong.
hapusEmptyKeysFromObject.js
meneruskan objek apa pun ke fungsi ini removeEmptyKeysFromObject ()
sumber
Untuk pencarian mendalam saya menggunakan kode berikut, mungkin ini akan berguna bagi siapa pun yang melihat pertanyaan ini (tidak dapat digunakan untuk dependensi siklik):
sumber
Jika Anda tidak ingin bermutasi di tempat, tetapi mengembalikan klon dengan null / undefined dihapus, Anda bisa menggunakan fungsi pengurangan ES6.
sumber
Alih-alih menghapus properti, Anda juga dapat membuat objek baru dengan kunci yang tidak nol.
sumber
Untuk piggypack pada jawaban Ben tentang cara untuk memecahkan masalah ini dengan menggunakan lodash ini
_.pickBy
, Anda juga dapat memecahkan masalah ini di adik perpustakaan: Underscore.js 's_.pick
.Lihat: Contoh JSFiddle
sumber
seorang pembantu mengurangi bisa melakukan trik (tanpa memeriksa jenis) -
sumber
Jika seseorang perlu menghapus
undefined
nilai dari suatu objek dengan pencarian mendalam menggunakanlodash
maka di sini adalah kode yang saya gunakan. Cukup mudah untuk memodifikasinya untuk menghapus semua nilai kosong (null
/undefined
).sumber
Dengan Lodash:
sumber
Jika Anda menggunakan eslint dan ingin menghindari melanggar aturan no-param-reassign, Anda dapat menggunakan Object.assign bersama dengan .reduce dan nama properti yang dihitung untuk solusi ES6 yang cukup elegan:
sumber
Berikut adalah cara fungsional untuk menghapus
nulls
dari Obyek menggunakan ES6 tanpa bermutasi objek hanya menggunakanreduce
:sumber
stripNulls
fungsi itu menggunakan referensi dari luar ruang lingkup fungsi akumulator; dan itu juga mencampur kekhawatiran dengan memfilter dalam fungsi akumulator. 😝 (mis.Object.entries(o).filter(([k,v]) => v !== null).reduce((o, [k, v]) => {o[k] = v; return o;}, {});
) Ya, itu akan mengulang item yang disaring dua kali tetapi kerugian yang disadari di sana dapat diabaikan.Anda juga dapat menggunakan
...
sintaks spread menggunakanforEach
sesuatu seperti ini:sumber
Bersihkan benda di tempatnya
Fungsi murni
sumber
Kita bisa menggunakan JSON.stringify dan JSON.parse untuk menghapus atribut kosong dari suatu objek.
sumber
{} != {}
dan[] != []
), tetapi sebaliknya pendekatan validBerikut adalah fungsi rekursif yang komprehensif (awalnya didasarkan pada yang oleh @chickens) yang akan:
defaults=[undefined, null, '', NaN]
PEMAKAIAN:
sumber
Jika Anda lebih suka pendekatan murni / fungsional
sumber