我在 Ruby on Rails 中有一个对象数组。我想根据对象的属性对数组进行排序。有可能吗?
是的,有可能
Http://ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/
是的,使用 Array#sort!这很容易。
Array#sort!
myarray.sort! { |a, b| a.attribute <=> b.attribute }
Array # sort 运行良好,如上所述:
但是,您需要确保为该属性实现了 <=>操作符。如果是 Ruby 本机数据类型,这不是问题。否则,编写您自己的实现,如果 a < b,返回 -1,如果它们相等,返回0,如果 a > b,返回1。
<=>
我建议改用 sort _ by:
objects.sort_by {|obj| obj.attribute}
特别是在可以计算属性的情况下。
或者一个更简洁的方法:
objects.sort_by(&:attribute)
如果您需要按两个属性进行排序,其中第一个属性比第二个属性更重要(意味着只有在第一个参数相等时才考虑第二个参数) ,那么您可以这样做
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] }
您可以通过重写 < = > 方法来使任何类可排序:
class Person attr_accessor :first_name, :last_name def initialize(first_name, last_name) @first_name = first_name @last_name = last_name end def <=>(other) @last_name + @first_name <=> other.last_name + other.first_name end end
现在,Person 对象的数组将在 last _ name 上进行排序。
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" ]
@model_name.sort! { |a,b| a.attribute <=> b.attribute }
升序:
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
更优雅的 objects.sort_by(&:attribute),您可以添加一个 .reverse,如果您需要切换的顺序。
.reverse