Хэш удалить все, кроме определенных ключей
Я хотел бы удалить каждый ключ из хэша, кроме заданного ключа.
Например:
{
"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"
}
]
}
Я хочу удалить все, кроме "firstName" и/или "address"
Спасибо
Ответы
Ответ 1
Некоторые другие опции:
h.select {|k,v| ["age", "address"].include?(k) }
Или вы можете это сделать:
class Hash
def select_keys(*args)
select {|k,v| args.include?(k) }
end
end
Итак, теперь вы можете просто сказать:
h.select_keys("age", "address")
Ответ 2
Как насчет slice
?
hash.slice('firstName', 'lastName')
# => { 'firstName' => 'John', 'lastName' => 'Smith' }
Ответ 3
Выбор хеша # делает то, что вы хотите:
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}
Изменить (для комментариев):
Предполагая, что h - ваш хэш выше:
h.select {|k,v| k == "age" || k == "address" }
Ответ 4
Если вы используете Rails, рассмотрите метод 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 }
Ответ 5
Вдохновленный ответом Джейка Демпси, этот должен быть быстрее для больших хэшей, поскольку он только пикает явные ключи, а не повторяет весь хэш:
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