Hash supprimer tout sauf les clés spécifiques

Je voudrais supprimer chaque clé d’un hash sauf une clé donnée.

Par exemple:

{ "firstName": "John", "lastName": "Smith", "age": 25, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021" }, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] } 

Je veux tout supprimer sauf “firstName” et / ou “address”

Merci

Quelques autres options:

 h.select {|k,v| ["age", "address"].include?(k) } 

Ou vous pourriez faire ceci:

 class Hash def select_keys(*args) select {|k,v| args.include?(k) } end end 

Donc, vous pouvez maintenant simplement dire:

 h.select_keys("age", "address") 

Qu’en est-il de la slice ?

 hash.slice('firstName', 'lastName') # => { 'firstName' => 'John', 'lastName' => 'Smith' } 

Hash # select fait ce que vous voulez:

  h = { "a" => 100, "b" => 200, "c" => 300 } h.select {|k,v| k > "a"} #=> {"b" => 200, "c" => 300} h.select {|k,v| v < 200} #=> {"a" => 100} 

Modifier (pour commentaire):

en supposant que h est votre hachage ci-dessus:

 h.select {|k,v| k == "age" || k == "address" } 

Inspiré par la réponse de Jake Dempsey, celui-ci devrait être plus rapide pour les grands hachages, car il ne pointe que les clés explicites plutôt que de parcourir l’ensemble du hachage:

 class Hash def select_keys(*args) filtered_hash = {} args.each do |arg| filtered_hash[arg] = self[arg] if self.has_key?(arg) end return filtered_hash end end 

Si vous utilisez Rails, veuillez considérer la méthode ActiveSupport except() : http://apidock.com/rails/Hash/except

 hash = { a: true, b: false, c: nil} hash.except!(:c) # => { a: true, b: false} hash # => { a: true, b: false } 

Aucun Rails requirejs pour obtenir un code très concis:

 keys = [ "firstName" , "address" ] # keys = hash.keys - (hash.keys - keys) # uncomment if needed to preserve hash order keys.zip(hash.values_at *keys).to_h