Как проверить, присутствует ли конкретное значение в хэше? - PullRequest
25 голосов
/ 26 января 2012

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

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

Ответы [ 8 ]

52 голосов
/ 26 января 2012

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

hash.has_value?(value_you_seek)

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

hash.key(value_you_seek)

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

4 голосов
/ 26 января 2012
3 голосов
/ 14 декабря 2018

Представьте, что у вас есть следующие 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

3 голосов
/ 19 июля 2018

Самый простой способ проверить наличие нескольких значений в хэше:

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? }
1 голос
/ 26 января 2012

Класс Hash имеет метод select , который будет возвращать новый хэш записей, для которых блок истинен;

h = { "a" => 100, "b" => 200, "c" => 300 }
h.select {|k,v| v == 200}  #=> {"b" => 200}

Таким образом, вы будете искать по значению и получите свой ключ!

0 голосов
/ 01 мая 2016

Если вы делаете hash.values, теперь у вас есть массив.

В массивах вы можете использовать метод поиска Enumerable include?

hash.values.include?(value_you_seek)
0 голосов
/ 19 апреля 2016

Хотя Hash#has_key? работает, но, как писал Матц здесь , оно устарело в пользу Hash#key?.

Метод

Hash key? сообщает вам, присутствует ли данный ключ или нет.

hash.key?(:some_key)
0 голосов
/ 12 декабря 2014

Еще более короткая версия, которую вы могли бы использовать, была бы hash.values

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...