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

时间:2009-05-19 10:54:12

标签: ruby sorting object

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

9 个答案:

答案 0 :(得分:188)

我建议改用sort_by:

objects.sort_by {|obj| obj.attribute}

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

或者更简洁的方法:

objects.sort_by(&:attribute)

答案 1 :(得分:33)

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

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

答案 2 :(得分:26)

升序:

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

答案 3 :(得分:18)

如果您需要按两个属性进行排序,其中第一个更重要,然后第二个(意味着仅在第一个参数相等时才考虑第二个参数),那么您可能会这样做

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] }

答案 4 :(得分:12)

您可以通过覆盖&lt; =&gt;来使任何类可排序方法:

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" ]

答案 5 :(得分:9)

数组#排序效果很好,如上所述:

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

但是,您需要确保为该属性实施<=>运算符。如果它是Ruby本机数据类型,这不是问题。否则,编写自己的实现,如果&lt; b,如果它们相等则为0,如果a> 1则为1。湾

答案 6 :(得分:8)

更优雅objects.sort_by(&:attribute),如果您需要切换订单,可以添加.reverse

答案 7 :(得分:-1)

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

答案 8 :(得分:-2)