Как искать значение ключа ha sh в массиве хешей - PullRequest
0 голосов
/ 09 февраля 2020

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

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

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

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

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

Я получаю

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

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

array.second[:place]

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

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

Ответы [ 3 ]

1 голос
/ 09 февраля 2020

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

array.find { |h| break h[:place] if h[:name] == 'John' }
#⇒ "B"
0 голосов
/ 09 февраля 2020

Будет возвращено значение:

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

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

0 голосов
/ 09 февраля 2020

find возвращает га sh в вашем случае, просто введите ключ :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"} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...