Saya memiliki objek Javascript seperti:
var my_object = { a:undefined, b:2, c:4, d:undefined };
Bagaimana cara menghapus semua properti yang tidak terdefinisi? Atribut palsu harus tetap ada.
javascript
object
lodash
JLavoie
sumber
sumber
_.pickBy(obj, _.identity);
false
valuAnda hanya dapat rantai
_.omit()
dengan_.isUndefined
dan_.isNull
komposisi, dan mendapatkan hasil dengan evaluasi malas.Demo
Pembaruan 14 Maret 2016 :
Seperti yang disebutkan oleh dylants di bagian komentar, Anda harus menggunakan
_.omitBy()
fungsi ini karena menggunakan predikat alih-alih properti. Anda harus menggunakan ini untuk versi lodash ke4.0.0
atas.DEMO
Pembaruan 1 Juni 2016 :
Seperti dikomentari oleh Max Truxa , lodash sudah memberikan alternatif
_.isNil
, yang memeriksa keduanyanull
danundefined
:sumber
omitBy
fungsi alih-alihomit
. Jadi_(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
_.isNil
alih-alih chaining_.isUndefined
dan_.isNull
. Ini membuatnya lebih pendek:var result = _.omitBy(my_object, _.isNil);
omitBy
kurang performan daripadapickBy
, jadi yang terakhir harus lebih disukai, dan kondisi dalam fungsi iteratee terbalik. Jawaban yang diterima di atas benar.null
danundefined
nilainya. Theidentity
predikat juga akan menghapusfalse
nilai-nilai, jadi jika Anda hanya berdasarkan itu atas pertanyaan ini niat maka saya tidak melihat masalah dengan jawaban saya. Selain itu, jika kita membahas "kinerja",omitBy
cukup panggilpickBy
denganidentity
predikat yang dinegasikan , secara default. Jadi, dalam hal kinerja, terlalu kecil untuk menjadi signifikan.jika Anda menggunakan lodash, Anda bisa menggunakan
_.compact(array)
untuk menghapus semua nilai palsu dari array.https://lodash.com/docs/4.17.4#compact
sumber
_.pickBy(object, _.isNumber)
dalam kasus itu.Jawaban yang benar adalah:
Itu menghasilkan:
Alternatif yang diberikan di sini oleh orang lain:
Akan menghapus juga
false
nilai-nilai yang tidak diinginkan di sini.sumber
{"a":1,"b":{"a":1,"b":null,"c":undefined}}
, properti object.bb
, 'c' tidak akan dihapusHanya:
Hal di atas tidak memperhitungkan
null
nilai akun , karena tidak ada dalam contoh asli dan hanya disebutkan dalam subjek, tetapi saya membiarkannya karena elegan dan mungkin memiliki kegunaannya.Berikut adalah contoh lengkapnya, kurang ringkas, tetapi lebih lengkap.
sumber
_.omitBy
.Untuk melengkapi jawaban lain, dalam lodash 4 untuk mengabaikan hanya undefined dan null (Dan bukan sifat suka
false
) Anda dapat menggunakan predikat di_.pickBy
:_.pickBy(obj, v !== null && v !== undefined)
Contoh di bawah ini:
sumber
0
,''
,false
nilai-nilai. Anda juga dapat mempersingkat panggilan balik kev => v != null
.Menurut dokumen Lodash:
Anda juga dapat memfilter semua nol
sumber
Untuk objek bersarang mendalam, Anda dapat menggunakan potongan saya untuk lodash> 4
sumber
Saya mengalami masalah yang sama dengan menghapus
undefined
dari suatu objek (dalam), dan menemukan bahwa jika Anda OK untuk mengkonversi objek lama polos Anda dan menggunakan JSON, fungsi pembantu yang cepat dan kotor akan terlihat seperti ini:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description
"... Jika tidak terdefinisi, suatu fungsi, atau simbol ditemukan selama konversi, maka itu dihilangkan (ketika ditemukan dalam suatu objek) atau disensor ke nol (ketika ditemukan dalam array)."
sumber
dengan JavaScript murni: (meskipun Object.entries adalah ES7, Object.assign adalah ES6; tetapi ES5 yang setara menggunakan Object.keys hanya juga bisa dilakukan); juga perhatikan
v != null
cek untuk null dan tidak terdefinisi;Sunting: ini di bawah ini adalah versi dengan ES5 Object.keys saja: tetapi secara umum dengan ES7 di Node v8 cukup menyenangkan ;-)
Pembaruan pada Oktober 2017 : dengan Node v8 (sejak v8.3 atau lebih) sekarang ia memiliki konstruksi penyebaran objek:
atau dalam satu pengurangan saja:
Perbarui: seseorang ingin rekursif? tidak sulit juga, hanya perlu memeriksa isObject tambahan, dan menyebut dirinya sendiri secara rekursif:
kesimpulan saya: jika Javascript murni dapat melakukannya, saya akan menghindari ketergantungan perpustakaan pihak ketiga:
sumber
Karena beberapa dari Anda mungkin telah tiba di pertanyaan mencari untuk secara khusus menghapus hanya
undefined
, Anda dapat menggunakan:kombinasi metode Lodash
yang
rundef
paket, yang menghilangkan hanyaundefined
sifatJika Anda perlu menghapus properti secara rekursif
undefined
,rundef
paket juga memilikirecursive
opsi.Lihat dokumentasi untuk lebih jelasnya.
sumber
Inilah pendekatan lodash yang akan saya ambil:
Fungsi pasangan () mengubah objek input menjadi array array kunci / nilai. Anda melakukan ini sehingga lebih mudah menggunakan tolak () untuk menghilangkan
undefined
dannull
menghargai. Setelah itu, Anda pergi dengan pasangan yang tidak ditolak, dan ini adalah input untuk zipObject () , yang merekonstruksi objek Anda untuk Anda.sumber
Dengan memperhitungkan itu
undefined == null
kita bisa menulis sebagai berikut:Contoh JSBin
sumber
pickBy menggunakan identitas secara default:
sumber
Cara terpendek (lodash v4):
sumber
Dengan lodash (atau garis bawah), Anda dapat melakukannya
Kalau tidak, dengan JavaScript vanilla, Anda bisa melakukannya
Tidak menggunakan tes falsey, karena tidak hanya "tidak terdefinisi" atau "null" akan ditolak , juga nilai falsey lainnya seperti "false", "0", string kosong, {}. Jadi, hanya untuk membuatnya sederhana dan dapat dimengerti, saya memilih untuk menggunakan perbandingan eksplisit seperti yang dikodekan di atas.
sumber
Untuk menghilangkan semua nilai falsey tetapi menjaga primitif boolean solusi ini membantu.
sumber
sumber
Saya akan menggunakan garis bawah dan merawat string kosong juga:
jsbin .
sumber
Untuk objek dan array bersarang yang dalam. dan mengecualikan nilai kosong dari string dan NaN
hasil:
sumber
Saya suka menggunakan _.pickBy, karena Anda memiliki kontrol penuh atas apa yang Anda hapus:
Sumber: https://www.codegrepper.com/?search_term=lodash+remove+undefined+values+from+object
sumber
Bagi Anda yang ingin mencari di sini untuk menghapus dari array objek dan menggunakan lodash Anda dapat melakukan sesuatu seperti ini:
Catatan: Anda tidak harus merusak jika tidak mau.
sumber