2 votes

Méthode Rubyist pour tester la présence d'une clé de hachage dans un tableau

J'analyse un fichier JSON qui a été converti en structures de données Ruby. J'ai des enregistrements qui ressemblent à ceci :

"uros"=>[{"ure"=>"zip*less", "prs"=>[{"mw"=>"zip-ls", "sound"=>{"audio"=>"ziples01", "ref"=>"c", "stat"=>"1"}}]

ou comme ça :

"uros"=>[{"ure"=>"gas chromatographic", "fl"=>"adjective"}]

Je veux extraire la valeur de hachage pour la clé audio lorsqu'il apparaît.

Quelle est la manière propre de tester la présence d'une clé en Ruby ? Voici mes tentatives jusqu'à présent. La variable entry représente la structure de données englobante :

if entry["uros"] != nil # Nope              
#if entry["uros"]["prs"] != nil  # Nope 
#if not entry["uros"]["prs"]["sound"]["audio"].first.instance_of? nil  # Nope 
#if ! entry["uros"]["prs"].instance_of? nil  # Nope 

    puts entry["uros"].first["prs"].first["sound"]["audio"]

end

Le message d'erreur que je reçois est soit :

undefined method `first' for nil:NilClass (NoMethodError)

ou inversement :

 undefined method `[]' for nil:NilClass (NoMethodError)

Comment feriez-vous ?

2voto

Sergio Tulentsev Points 82783

Hash a un méthode pour vérifier la présence d'une paire clé-valeur

if entry.key?('uros')

Mais le problème avec votre code est que vous ne vérifiez pas l'existence des clés imbriquées. Vous vérifiez "uros", mais alors "prs" pourrait ne pas exister.

Voici une meilleure version qui autorise les nils à chaque étape.

audio = entry.dig('uros', 0, 'prs', 0, 'sound', 'audio')

0voto

Schwern Points 33677

Vous pouvez utiliser le opérateur de navigation sûr pour rechercher dans la structure de données sans obtenir un tas de NoMethodErrors. L'opérateur de navigation sûre appellera la méthode, ou retournera nil si elle est appelée le nil .

audio = entry["uros"]
  &.first
  &.[]("prs")
  &.first
  &.dig("sound", "audio")

Ça peut paraître drôle, mais souviens-toi que [] est une méthode comme une autre. Si une partie de cette chaîne de méthodes renvoie nil le tout reviendra nil .

entry["uros"]&.first est à peu près équivalent à...

entry["uros"].first if entry["uros"] != nil

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X