Учитывая, что у меня есть хэш клиентов ниже , есть ли быстрый способ ruby (без необходимости написания многострочного скрипта), чтобы получить ключ, если я хочу соответствовать client_id? Например, как получить ключ для client_id == "2180"
?
clients = {
"yellow"=>{"client_id"=>"2178"},
"orange"=>{"client_id"=>"2180"},
"red"=>{"client_id"=>"2179"},
"blue"=>{"client_id"=>"2181"}
}
find
и вselect
том, чтоfind
возвращает первое совпадение, иselect
(с псевдонимомfindAll
) возвращает все совпадения.invert
), чтобы найти элемент.clients.select{|key, hash| hash["client_id"] == "2180" } # => {"orange"=>{"client_id"=>"2180"}}
clients.select{|key, hash| hash["client_id"] == "2180" }.keys
Ruby 1.9 и выше:
Ruby 1.8 :
Вы могли бы использовать
hash.index
Таким образом, чтобы получить
"orange"
, вы можете просто использовать:источник
index
.Hash#index
переименованHash#key
в Ruby 1.9Вы можете инвертировать хеш.
clients.invert["client_id"=>"2180"]
возвращается"orange"
источник
Вы можете использовать hashname.key (valuename)
Или инверсия может быть в порядке.
new_hash = hashname.invert
даст вам,new_hash
что позволяет вам делать вещи более традиционно.источник
#invert
Это действительно плохая идея в этом случае, так как вы по сути выделяете память для одноразового хеш-объекта только ради поиска ключа. В зависимости от размера хэша это оказывает серьезное влияние на производительностьпопробуй это:
источник
.try(:first)
вместо того,.first
чтобы избегать исключений (если вы ожидаете, что это возможно для пропущенного значения).Ruby 2.3.0 +
вы можете использовать безопасный навигатор&.first
в конце блока , чтобы предотвратить от Nil ИсключениеСогласно ruby doc http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-key ключ (значение) - это метод поиска ключа на основе значения.
он вернет «конструктор».
источник
Из документов:
Пропускает каждую запись в enum для блокировки. Возвращает первое, для которого блок не является ложным. Если ни один объект не соответствует, вызывает ifnone и возвращает его результат, когда он указан, или возвращает nil в противном случае.
Если блок не задан, вместо него возвращается перечислитель.
Это сработало для меня:
Смотрите: http://rubydoc.info/stdlib/core/1.9.2/Enumerable#find-instance_method
источник
Лучший способ найти ключ для определенного значения - использовать метод ключа, который доступен для хэша ....
Я надеюсь, что это решит вашу проблему ...
источник
Другой подход, который я бы попробовал, заключается в использовании
#map
Это вернет все вхождения заданного значения. Подчеркивание означает, что нам не нужно переносить значение ключа, чтобы его нельзя было присвоить переменной. Массив будет содержать нули, если значения не совпадают - поэтому я поставил
#compact
в конце.источник
Вот простой способ найти ключи заданного значения:
... и найти значение данного ключа:
это даст вам пару ключ-значение.
источник