将常量数组与对象数组进行比较

问题描述:

我有一些具有某些属性的对象的集合。 我也有一个常量ID的数组。将常量数组与对象数组进行比较

我想要返回具有存在于常量数组中的ID的整个对象。

这是我迄今为止,但它只是返回true或false每个,我需要它返回的所有对象的数组:

some_object_attributes.collect { |attr| (Constant::SOME_IDS.include? attr.object.object_type_id)} 

我怎样才能回报每一位attr.object它有一个常量数组中的ID?

+0

常数中有多少个ID?对象数组的大小是多少?使用'Set'而不是数组可能会提高性能。 – spickermann

+1

这是不是一个查询参数的原因?就像'scope:in_constant_array, - > {where(object_type_id:Constant :: SOME_IDS)}''那么你可以利用SQL来完成提升而不是在mem – engineersmnky

+0

常量中只有十几个ID .. – user3437721

你不想做collect(又名map),它返回块的结果。您希望根据块的结果返回集合中的对象。为此,有select

some_object_attributes.select do |attr| 
    Constant::SOME_IDS.include? attr.object.object_type_id 
end 

使用select而不是collect

collect返回评估结果(truefalse)。 select将返回对象。

这个article可能是有用的。

只是出于好奇,一个真正巨大的阵列方式,它可能会更快:

some_object_attributes.group_by do |attr| 
    attr.object.object_type_id 
end.values_at(*Constant::SOME_IDS).flatten 

这是O(N),因为它不抬头看Constant::SOME_IDS阵列每个元素。

+0

I吸收算法的复杂性,但是'values_at'不会在幕后做类似的事情,迭代和匹配?这肯定比Ruby更快,但仍会影响您的成本。 – coreyward

+0

@coreyward它查找散列,它被承诺为O(1)。 – mudasobwa

+0

Ohhh这是正确的,因为散列查找表除以按位散列并且不扫描整个表。真棒。 – coreyward