2015-06-25 4 views
1

У меня есть массив хэшей:Лучший способ поиска массива в Ruby?

arr = [{"id"=>"1", "name"=>"Alan"}, {"id"=>"2", "name"=>"Ben"}, {"id"=>"3", "name"=>"Carl"}, {"id"=>"4", "name"=>"Danny"}, {"id"=>"5", "name"=>"Eva"}] 

Если бы я найти имя ID # 4:

arr.find{ |a| a["id"] == "4" }["name"] 

возвращается "Дэнни", который является то, что я хочу.

Мой вопрос в том, есть ли более короткий, более элегантный способ выполнить тот же поиск?

+8

Что не элегантный об этом? Совершенно читаемый код, ничего лишнего. –

+0

Echoing Sergio - это как можно лучше, чтобы это сделать. –

ответ

4

Если вам нужен только один идентификатор, линейный поиск, как вы делаете, в порядке.

Если вы делаете много Lookups на том же массиве, создать хэш из массива, поэтому отдельные поиски являются O (1)

h = Hash[arr.map{|a|[a["id"], a["name"]]}] 
h["4"] 
0

Это вполне разумный способ сделать это. Единственная проблема, которую я вижу, заключается в том, что ваша структура данных не подходит для поиска. Вам нужно искать в массиве, вместо поиска по ID в хеше. Поиск в массиве - O (N) и относительно сложный код. Глядя в хэш, есть O (1) и вообще не является кодом.

Итак, я бы преобразовал массив в хэш, а затем посмотрел в него. Особенно, если вы планируете много искать.

people = arr.inject({}) {|memo,v| memo[v["id"].to_i]=v["name"]; memo} 
people[4] # will return Danny 
people[3] # will return Carl 

Надеюсь, это поможет!

Смежные вопросы