Подтвердить что ты не робот

Как проверить, присутствует ли конкретное значение в хеше?

Я использую Rails, и у меня есть хэш-объект. Я хочу искать хеш для определенного значения. Я не знаю ключей, связанных с этим значением.

Как проверить, присутствует ли конкретное значение в хеше? Кроме того, как мне найти ключ, связанный с этим конкретным значением?

4b9b3361

Ответ 1

Hash включает Enumerable, поэтому вы можете использовать множество методов в этом модуле для перемещения хэша. Он также имеет этот удобный метод:

hash.has_value?(value_you_seek)

Чтобы найти ключ, связанный с этим значением:

hash.key(value_you_seek)

Эта документация API для Ruby (1.9.2) должна быть полезна.

Ответ 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