按对象属性对 Ruby 中的对象数组进行排序?

我在 Ruby on Rails 中有一个对象数组。我想根据对象的属性对数组进行排序。有可能吗?

97335 次浏览

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

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

Array # sort 运行良好,如上所述:

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

但是,您需要确保为该属性实现了 <=>操作符。如果是 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,如果您需要切换的顺序。