Chciałbym usunąć każdy klucz z skrótu oprócz danego klucza.
Na przykład:
{
"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"
}
]
}
Chcę usunąć wszystko oprócz „imię” i / lub „adres”
Dzięki
ruby-on-rails
ruby
ruby-on-rails-3
glarkou
źródło
źródło
O co chodzi
slice
?hash.slice('firstName', 'lastName') # => { 'firstName' => 'John', 'lastName' => 'Smith' }
źródło
slice
.Hash # select robi to, co chcesz:
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}
Edytuj (dla komentarza):
zakładając, że h jest twoim hashem powyżej:
h.select {|k,v| k == "age" || k == "address" }
źródło
Jeśli używasz Railsów, rozważ
except()
metodę ActiveSupport : http://apidock.com/rails/Hash/excepthash = { a: true, b: false, c: nil} hash.except!(:c) # => { a: true, b: false} hash # => { a: true, b: false }
źródło
Zainspirowany odpowiedzią Jake'a Dempseya, ten powinien być szybszy dla dużych haszów, ponieważ tylko wyskakuje jawne klucze, a nie iteruje przez cały hash:
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
źródło
Żadne Railsy nie są potrzebne do uzyskania bardzo zwięzłego kodu:
keys = [ "firstName" , "address" ] # keys = hash.keys - (hash.keys - keys) # uncomment if needed to preserve hash order keys.zip(hash.values_at *keys).to_h
źródło
hash = { a: true, b: false, c: nil } hash.extract!(:c) # => { c: nil } hash # => { a: true, b: false }
źródło