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