Как проверить, присутствует ли конкретное значение в хеше?
Я использую Rails, и у меня есть хэш-объект. Я хочу искать хеш для определенного значения. Я не знаю ключей, связанных с этим значением.
Как проверить, присутствует ли конкретное значение в хеше? Кроме того, как мне найти ключ, связанный с этим конкретным значением?
Ответы
Ответ 1
Hash включает Enumerable, поэтому вы можете использовать множество методов в этом модуле для перемещения хэша. Он также имеет этот удобный метод:
hash.has_value?(value_you_seek)
Чтобы найти ключ, связанный с этим значением:
hash.key(value_you_seek)
Эта документация API для Ruby (1.9.2) должна быть полезна.
Ответ 2
Hash.has_value? и Hash.key.
Ответ 3
Класс Hash
имеет метод select, который будет возвращать новый хеш записей, для которых блок является истинным;
h = { "a" => 100, "b" => 200, "c" => 300 }
h.select {|k,v| v == 200} #=> {"b" => 200}
Таким образом вы будете искать по значению и получите свой ключ!
Ответ 4
Самый простой способ проверить наличие нескольких значений в хэше:
h = { a: :b, c: :d }
h.values_at(:a, :c).all? #=> true
h.values_at(:a, :x).all? #=> false
В случае, если вам нужно проверить также пустые значения в Rails с ActiveSupport:
h.values_at(:a, :c).all?(&:present?)
или же
h.values_at(:a, :c).none?(&:blank?)
То же самое в Ruby без ActiveSupport можно сделать, передав блок:
h.values_at(:a, :c).all? { |i| i && !i.empty? }
Ответ 5
Пока Hash#has_key?
работает, но, поскольку Мац написал здесь, он устарел в пользу Hash#key?
.
Hash
key?
указывает, присутствует ли данный ключ или нет.
hash.key?(:some_key)
Ответ 6
Если вы выполняете hash.values
, теперь у вас есть массив.
В массивах вы можете использовать метод поиска Enumerable включить?
hash.values.include?(value_you_seek)
Ответ 7
Представьте, что у вас есть следующий Array
хэшей
available_sports = [{name:'baseball', label:'MLB Baseball'},{name:'tackle_football', label:'NFL Football'}]
Делать что-то подобное поможет
available_sports.any? {|h| h['name'] == 'basketball'}
=> false
available_sports.any? {|h| h['name'] == 'tackle_football'}
=> true
Ответ 8
Еще более короткая версия, которую вы могли бы использовать, была бы hash.values