Bagaimana cara saya menghapus semua elemen kosong (daftar kosong item) dari file Hash atau YAML bersarang?
ruby-on-rails
ruby
hash
yaml
Brian Jordan
sumber
sumber
Hash#delete_if
adalah operasi yang merusak, sementaracompact
metode tidak mengubah objek. Anda bisa menggunakannyaHash#reject
. Atau hubungi metodeHash#compact!
.compact
dancompact!
datang standar di Ruby => 2.4.0, dan Rails => 4.1. Mereka non-rekursif.HashWithIndifferentAccess
.. Periksa versi saya di stackoverflow.com/a/53958201/1519240Rails 4.1 menambahkan Hash # compact dan Hash # compact! sebagai ekstensi inti ke
Hash
kelas Ruby . Anda dapat menggunakannya seperti ini:Kepala: implementasi ini tidak rekursif. Sebagai rasa ingin tahu, mereka mengimplementasikannya menggunakan
#select
bukan#delete_if
karena alasan kinerja. Lihat di sini untuk patokan .Jika Anda ingin membuat backport ke aplikasi Rails 3 Anda:
sumber
Gunakan hsh.delete_if . Dalam kasus spesifik Anda, sesuatu seperti:
hsh.delete_if { |k, v| v.empty? }
sumber
proc = Proc.new { |k, v| v.kind_of?(Hash) ? (v.delete_if(&l); nil) : v.empty? }; hsh.delete_if(&proc)
NoMethodError
ifv
is nil.Jika Anda menggunakan Ruby 2.4+, Anda dapat menelepon
compact
dancompact!
https://ruby-doc.org/core-2.4.0/Hash.html#method-i-compact-21
sumber
Yang ini juga akan menghapus hash yang kosong:
sumber
swoop = Proc.new { |k, v| v.delete_if(&swoop) if v.kind_of?(Hash); v.blank? }
Anda dapat menggunakan Hash # reject untuk menghapus pasangan kunci / nilai kosong dari Hash ruby.
sumber
.empty?
melempar kesalahan untuk angka-angka, sehingga Anda dapat menggunakan.blank?
inRails
bekerja untuk hash dan array
PS berdasarkan jawaban someones, cant find
penggunaan -
Helpers::RecursiveCompact.recursive_compact(something)
sumber
Saya tahu utas ini agak lama tetapi saya datang dengan solusi yang lebih baik yang mendukung hash Multidimensi. Ini menggunakan delete_if? kecuali multidimensi dan membersihkan apa pun dengan nilai kosong secara default dan jika blok dilewatkan maka akan diturunkan melalui anak-anak itu.
sumber
Saya membuat metode deep_compact untuk ini yang secara rekursif menyaring catatan nil (dan juga catatan kosong):
sumber
Ruby
Hash#compact
,Hash#compact!
danHash#delete_if!
tidak bekerja pada nestednil
,empty?
dan / ataublank?
nilai - nilai. Perhatikan bahwa dua yang terakhir metode yang merusak, dan bahwa semuanil
,""
,false
,[]
dan{}
nilai-nilai dihitung sebagaiblank?
.Hash#compact
danHash#compact!
hanya tersedia di Rails, atau Ruby versi 2.4.0 ke atas.Berikut adalah solusi non-destruktif yang menghapus semua array kosong, hash, string, dan
nil
nilai, sembari menjaga semuafalse
nilai:(
blank?
dapat diganti dengannil?
atauempty?
sesuai kebutuhan.)Versi destruktif:
Atau, jika Anda ingin menambahkan kedua versi sebagai metode instan di
Hash
kelas:Pilihan lain:
v.blank? && v != false
denganv.nil? || v == ""
untuk menghapus string dannil
nilai kosongv.blank? && v != false
denganv.nil?
untuk menghapusnil
nilai-nilai secara ketatEDITED 2017/03/15 untuk menjaga
false
nilai dan menyajikan opsi lainsumber
versi kami: itu juga membersihkan string kosong dan nilai nil
sumber
Dalam Simple one liner untuk menghapus nilai null di Hash,
sumber
blank?
berlaku untuk string kosong jugaDapat dilakukan dengan facet library (fitur yang hilang dari perpustakaan standar), seperti itu:
Bekerja dengan Enumerable apa pun (termasuk Array, Hash).
Lihat bagaimana metode rekursif diimplementasikan.
sumber
Saya percaya akan lebih baik menggunakan metode rekursif diri. Dengan begitu ia berjalan sedalam yang dibutuhkan. Ini akan menghapus pasangan nilai kunci jika nilainya nol atau Hash kosong.
Kemudian menggunakannya akan terlihat seperti ini:
Untuk menyimpan hash kosong, Anda dapat menyederhanakan ini.
sumber
sumber
Coba ini untuk menghapus nol
sumber
hash.compact!
Versi rekursif https://stackoverflow.com/a/14773555/1519240 berfungsi, tetapi tidak dengan
HashWithIndifferentAccess
atau kelas lain yang merupakan jenis Hash ..Ini adalah versi yang saya gunakan:
kind_of?(Hash)
akan menerima lebih banyak kelas yang seperti Hash.Anda juga dapat mengganti
inject({})
denganinject(HashWithIndifferentAccess.new)
jika Anda ingin mengakses hash baru menggunakan simbol dan string.sumber
Ini adalah sesuatu yang saya miliki:
sumber
Nilai nih penghapusan dalam dari hash.
sumber
Jika Anda menggunakan
Rails
(atau mandiriActiveSupport
), mulai dari versi6.1
, adacompact_blank
metode yang menghapusblank
nilai dari hash.Ini digunakan di
Object#blank?
bawah tenda untuk menentukan apakah suatu barang kosong.Berikut adalah tautan ke dokumen dan tautan ke PR relatif .
Varian destruktif juga tersedia. Lihat
Hash#compact_blank!
.Jika Anda hanya perlu menghapus
nil
nilai,tolong, pertimbangkan untuk menggunakan Ruby build-in
Hash#compact
danHash#compact!
metode.sumber