Comment procéder pour supprimer tous les éléments vides (éléments de liste vides) d'un fichier Hash ou YAML imbriqué?
ruby-on-rails
ruby
hash
yaml
Brian Jordan
la source
la source
Hash#delete_if
c'est une opération destructive, alors que lescompact
méthodes ne modifient pas l'objet. Vous pouvez utiliserHash#reject
. Ou appelez la méthodeHash#compact!
.compact
etcompact!
venir en standard dans Ruby => 2.4.0, et Rails => 4.1. Ils ne sont cependant pas récursifs.HashWithIndifferentAccess
.. Vérifiez ma version sur stackoverflow.com/a/53958201/1519240Rails 4.1 a ajouté Hash # compact et Hash # compact! comme extensions de base de la
Hash
classe Ruby . Vous pouvez les utiliser comme ceci:Attention: cette implémentation n'est pas récursive. Par curiosité, ils l'ont implémenté en utilisant
#select
plutôt que#delete_if
pour des raisons de performances. Voir ici pour le benchmark .Si vous souhaitez le rétroporter sur votre application Rails 3:
la source
Utilisez hsh.delete_if . Dans votre cas spécifique, quelque chose comme:
hsh.delete_if { |k, v| v.empty? }
la source
proc = Proc.new { |k, v| v.kind_of?(Hash) ? (v.delete_if(&l); nil) : v.empty? }; hsh.delete_if(&proc)
NoMethodError
siv
est nul.Si vous utilisez Ruby 2.4+, vous pouvez appeler
compact
etcompact!
https://ruby-doc.org/core-2.4.0/Hash.html#method-i-compact-21
la source
Celui-ci supprimerait également les hachages vides:
la source
swoop = Proc.new { |k, v| v.delete_if(&swoop) if v.kind_of?(Hash); v.blank? }
Vous pouvez utiliser Hash # Rejeter pour supprimer des paires clé / valeur vides d'un Hash ruby.
la source
.empty?
jette une erreur pour les nombres, vous pouvez donc utiliser.blank?
dansRails
fonctionne à la fois pour les hachages et les tableaux
PS basé sur la réponse de quelqu'un, impossible de trouver
utilisation -
Helpers::RecursiveCompact.recursive_compact(something)
la source
Je sais que ce fil est un peu vieux mais j'ai trouvé une meilleure solution qui prend en charge les hachages multidimensionnels. Il utilise delete_if? sauf qu'il est multidimensionnel et nettoie tout ce qui a une valeur vide par défaut et si un bloc est passé, il est passé à travers ses enfants.
la source
J'ai créé une méthode deep_compact pour cela qui filtre récursivement les enregistrements nuls (et éventuellement, les enregistrements vides également):
la source
Ruby
Hash#compact
,Hash#compact!
etHash#delete_if!
ne fonctionnent pas sur imbriquéenil
,empty?
et / ou desblank?
valeurs. Notez que les deux dernières méthodes sont destructrices, et que tousnil
,""
,false
,[]
et les{}
valeurs sont considérées commeblank?
.Hash#compact
etHash#compact!
ne sont disponibles que dans Rails ou Ruby version 2.4.0 et supérieure.Voici une solution non destructive qui supprime tous les tableaux vides, les hachages, les chaînes et les
nil
valeurs, tout en conservant toutes lesfalse
valeurs:(
blank?
peut être remplacé parnil?
ouempty?
au besoin.)Une version destructrice:
Ou, si vous souhaitez ajouter les deux versions en tant que méthodes d'instance sur la
Hash
classe:Autres options:
v.blank? && v != false
parv.nil? || v == ""
pour supprimer strictement les chaînes vides etnil
valeursv.blank? && v != false
parv.nil?
pour supprimer strictement lesnil
valeursEDITED 2017/03/15 pour conserver les
false
valeurs et présenter d'autres optionsla source
notre version: elle nettoie également les chaînes vides et les valeurs nulles
la source
Dans Simple one liner pour supprimer les valeurs nulles dans Hash,
la source
blank?
va aussi pour les cordes videsPeut être fait avec la bibliothèque de facettes (une fonctionnalité manquante de la bibliothèque standard), comme ça:
Fonctionne avec n'importe quel Enumerable (y compris Array, Hash).
Regardez comment la méthode est implémentée de manière récursive .
la source
Je pense qu'il serait préférable d'utiliser une méthode auto-récursive. De cette façon, il va aussi loin que nécessaire. Cela supprimera la paire clé / valeur si la valeur est nulle ou un hachage vide.
Ensuite, l'utiliser ressemblera à ceci:
Pour conserver les hachages vides, vous pouvez simplifier cela en.
la source
la source
Essayez ceci pour supprimer nil
la source
hash.compact!
La version récursive de https://stackoverflow.com/a/14773555/1519240 fonctionne, mais pas avec
HashWithIndifferentAccess
ou avec d' autres classes qui sont en quelque sorte Hash.Voici la version que j'utilise:
kind_of?(Hash)
acceptera plus de classes qui ressemblent à un hachage.Vous pouvez également remplacer
inject({})
parinject(HashWithIndifferentAccess.new)
si vous souhaitez accéder au nouveau hachage en utilisant à la fois le symbole et la chaîne.la source
Voici quelque chose que j'ai:
la source
Suppression profonde des valeurs nulles d'un hachage.
la source
Si vous utilisez
Rails
(ou une version autonomeActiveSupport
), à partir de la version6.1
, il existe unecompact_blank
méthode qui supprime lesblank
valeurs des hachages.Il utilise
Object#blank?
sous le capot pour déterminer si un élément est vide.Voici un lien vers les documents et un lien vers le PR relatif .
Une variante destructive est également disponible. Voir
Hash#compact_blank!
.Si vous devez supprimer uniquement des
nil
valeurs,s'il vous plaît, pensez à utiliser l'intégration
Hash#compact
et lesHash#compact!
méthodes Ruby .la source