64 votes

Filtre de hachage Ruby

J'essaie de comprendre comment filtrer les paires de clés et de valeurs d'un filtre à un autre

Par exemple je veux prendre ce hash

 x = { "one" => "one", "two" => "two", "three" => "three"}

y = x.some_function

y == { "one" => "one", "two" => "two"}
 

Merci de votre aide

EDIT: devrait probablement mentionner que dans cet exemple, je veux qu'il se comporte comme un filtre de liste blanche. C'est-à-dire que je sais ce que je veux, pas ce que je ne veux pas.

103voto

Brian Guthrie Points 1962

La bibliothèque ActiveSupport de Rails vous donne également des tranches et à l'exception du traitement du hachage à un niveau clé:

 y = x.slice("one", "two") # => { "one" => "one", "two" => "two" }
y = x.except("three")     # => { "one" => "one", "two" => "two" }
x.slice!("one", "two")    # x is now { "one" => "one", "two" => "two" }
 

Ce sont assez sympa, et je les utilise tout le temps.

54voto

sris Points 3040

Peut-être que c'est ce que vous voulez.

 wanted_keys = %w[one two]
x = { "one" => "one", "two" => "two", "three" => "three"}
x.select { |key,_| wanted_keys.include? key }
 

Le mixin Enumerable qui est inclus dans, par exemple, Array and Hash fournit beaucoup de méthodes utiles comme sélectionner / rejeter / chaque / etc. .. Je vous suggère de jeter un coup d'œil à la documentation correspondante avec ri Enumerable.

49voto

scottd Points 4120

Vous pouvez simplement utiliser la fonction de rejet intégrée de Hash.

 x = { "one" => "one", "two" => "two", "three" => "three"}
y = x.reject {|key,value| key == "three" }
y == { "one" => "one", "two" => "two"}
 

Vous pouvez mettre la logique de votre choix dans le rejet et si le bloc renvoie true, il ignorera cette clé, valeur dans le nouveau hachage.

7voto

Brian Campbell Points 101107
y = x.reject {|k,v| k == "three"}

7voto

stellard Points 1656

En combinant les réponses de chacun, je propose cette solution:

  wanted_keys = %w[one two]
 x = { "one" => "one", "two" => "two", "three" => "three"}
 x.reject { |key,_| !wanted_keys.include? key }
 =>{ "one" => "one", "two" => "two"}
 

Merci pour votre aide les gars!

MODIFIER:

Ce qui précède fonctionne en 1.8.7+

Ce qui suit fonctionne dans 1.9+:

x.select {| key, _ | wanted_keys.include? clé}

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