2017-04-19 138 views
0

我有一些具有某些屬性的對象的集合。 我也有一個常量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

回答

3

你不想做collect(又名map),它返回塊的結果。您希望根據塊的結果返回集合中的對象。爲此,有select

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

使用select而不是collect

collect返回評估結果(truefalse)。 select將返回對象。

這個article可能是有用的。

3

只是出於好奇,一個真正巨大的陣列方式,它可能會更快:

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

相關問題