Вот способ извлечения желаемых экземпляров из array_object
, который должен быть относительно эффективным.
Код
require 'set'
def extract(array_object, id_values)
idv = id_values.to_set
arr = []
array_object.each do |obj|
id = obj[:id]
if idv.include?(id)
arr << obj
idv.delete(id)
end
break if idv.empty?
end
idv.empty? ? arr : nil
end
Пример
id_values = [2, 3]
CustomPricing = Struct.new(:id, :base_price) {}
array_object = [[3, 700], [2, 500], [4, 900], [2, 500]].map do |id, bp|
CustomPricing.new(id, bp)
end
#=> [#<struct CustomPricing id=3, base_price=700>,
# #<struct CustomPricing id=2, base_price=500>,
# #<struct CustomPricing id=4, base_price=900>,
# #<struct CustomPricing id=2, base_price=500>]
Читатели, незнакомые со структурами (или нуждающиеся в зачистке), могут захотеть прочитать эту статью .
extract(array_object, id_values)
#=> [#<struct CustomPricing id=3, base_price=700>,
# #<struct CustomPricing id=2, base_price=500>]
Если объекты упорядочены по значениям :id
, отражающим их порядок в id_values
, предпоследнюю строку (idv.empty? ? arr : nil
) можно заменить следующим:
idv.empty? ? arr.sort_by { |obj| id_values.index(obj[:id]) } : nil
, который выдает следующее возвращаемое значение.
[#<struct CustomPricing id=2, base_price=500>,
#<struct CustomPricing id=3, base_price=700>]