通过对象属性对Ruby中的对象数组进行sorting?

我在Ruby on Rails中有一个对象数组。 我想按照对象的属性对数组进行sorting。 可能吗?

我build议使用sort_by代替:

objects.sort_by {|obj| obj.attribute} 

特别是如果可以计算属性。

是的,使用Array#sort! 这很容易。

 myarray.sort! { |a, b| a.attribute <=> b.attribute } 

如果你需要通过两个属性sorting,其中第一个更重要,然后第二个(意味着只有在第一个参数相等时才考虑第二个参数),那么你可以这样做

 myarray.sort{ |a,b| (a.attr1 == b.attr1) ? a.attr2 <=> b.attr2 : a.attr1 <=> b.attr1 } 

或者在数组数组的情况下

 myarray.sort{ |a,b| (a[0] == b[0]) ? a[1] <=> b[1] : a[0] <=> b[0] } 

升序:

 objects_array.sort! { |a, b| a.attribute <=> b.attribute } 

要么

 objects_array.sort_by{ |obj| obj.attribute } 

降序 :

 objects_array.sort! { |a, b| b.attribute <=> a.attribute } 

要么

 objects_array.sort_by{ |obj| obj.attribute }.reverse 

您可以通过重写<=>方法来使任何类可sorting:

 class Person attr_accessor :first_name, :last_name def initialize(first_name, last_name) @first_name = first_name @last_name = last_name end def <=>(per) @last_name + @first_name <=> per.last_name + per.first_name end end 

现在Person对象的数组可以在last_name上sorting。

 ar = [Person.new("Eric", "Cunningham"), Person.new("Homer", "Allen")] puts ar # => [ "Eric Cunningham", "Homer Allen"] (Person objects!) ar.sort! puts ar # => [ "Homer Allen", "Eric Cunningham" ] 

Array#sorting效果很好,如上所示:

 myarray.sort! { |a, b| a.attribute <=> b.attribute } 

但是,您需要确保<=>运算符是针对该属性实施的。 如果它是一个Ruby本地数据types,这不是一个问题。 否则,写你自己的实现,如果一个<b,则返回-1,如果它们相等,则返回0;如果a> b,则返回1。

更优雅的objects.sort_by(&:attribute) ,你可以添加一个.reverse如果你需要切换顺序。

 @model_name.sort! { |a,b| a.attribute <=> b.attribute }