Лучшее решение - использовать хеш в качестве индекса вместо поиска линейного массива для каждого ключа:
events = [{id:2, start:"3:30",break:30,num_attendees:14},{id:3, start:"3:40",break:40,num_attendees:4},{id:4, start:"4:40",break:10,num_attendees:40}]
return_keys = [ :id, :start ]
# Compute a quick hash to extract the right values: { key => true }
key_index = Hash[return_keys.collect { |key| [ key, true ] }]
return_array = events.collect do |event|
event.select do |key, value|
key_index[key]
end
end
# => [{:id=>2, :start=>"3:30"}, {:id=>3, :start=>"3:40"}, {:id=>4, :start=>"4:40"}]
Я настроил это, чтобы использовать символы в качестве имен ключей в соответствии с вашим определениемиз events
.
Это можно еще улучшить, используя return_keys
в качестве прямого драйвера:
events = [{id:2, start:"3:30",break:30,num_attendees:14},{id:3, start:"3:40",break:40,num_attendees:4},{id:4, start:"4:40",break:10,num_attendees:40}]
return_keys = [ :id, :start ]
return_array = events.collect do |event|
Hash[
return_keys.collect do |key|
[ key, event[key] ]
end
]
end
Результат тот же.Если извлекаемое подмножество имеет тенденцию быть намного меньше исходного, это может быть лучшим подходом.