Как искать значение ключа хеша в массиве хешей

У меня есть массив хэшей:

array = [
 {:name => "Bob" , :age => 27 , :place => "A"} ,
 {:name => "John" , :age => 50 , :place => "B"} ,
 {:name => "Alex" , :age => 80 , :place => "C"} 
]

Я хочу получить значение :place if :name == "John" .

Однако, если я использую

array.find {|x| x[:name] == "John"}

я получил

{:name=>"John", :age=>"27", :place=>A}

я могу использовать

array.second[:place]

который вернет B , но массив будет иметь более трех элементов Hash.

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

Всего 3 ответа


find возвращает хеш в вашем случае, просто передайте ключ :place чтобы получить значение:

hash = array.find {|x| x[:name] == "John"}
return if hash.nil?
hash[:place]

Что касается запроса о смешанных значениях, я просто попробовал его в IRB, и он работал нормально.

2.7.0 :014 > array = [
2.7.0 :015 >   {:name => "Bob" , :age => 27 , :place => "A"} ,
2.7.0 :016 >   {:name => "John" , :age => 50 , :place => "B"} ,
2.7.0 :017 >   {:name => "Alex" , :age => 80 , :place => "C"} 
2.7.0 :018 > ]
2.7.0 :019 > array.find {|x| x[:name] == "John"}
 => {:name=>"John", :age=>50, :place=>"B"} 

Если нужен единственный вызов метода, они могут обмануть find с более ранним возвратом.

array.find { |h| break h[:place] if h[:name] == 'John' }
#⇒ "B"

Это вернет значение:

 p array.find {|x| x[:name] == "John"}[:place]

Создайте метод и передайте "John" в качестве параметра, чтобы вы могли получить значение и для других имен.


Есть идеи?

10000