Eine bessere Lösung ist es, einen Hash als Index zu verwenden, anstatt ein lineares Array für jeden Schlüssel zu suchen:
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"}]
Ich habe dies angepasst, um Symbole als Schlüsselnamen zu verwenden, um Ihrer Definition von events
.
Dies kann noch verbessert werden, indem man die return_keys
als direkter Treiber:
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
Das Ergebnis ist das gleiche. Wenn die Teilmenge, die Sie extrahieren, tendenziell viel kleiner ist als das Original, könnte dies die beste Vorgehensweise sein.