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

115 ruby sorting object

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

Sco*_*ott 201

我推荐使用sort_by:

objects.sort_by {|obj| obj.attribute}
Run Code Online (Sandbox Code Playgroud)

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

或者更简洁的方法:

objects.sort_by(&:attribute)
Run Code Online (Sandbox Code Playgroud)

  • 或简写版本:`objects.sort_by(&:attribute)` (77认同)
  • 甚至更短的objects.sort_by&:属性 (3认同)
  • 如果您对大写和小写字母单独排序有问题,可以使用`objects.sort_by { |obj| obj.attribute.downcase }` (2认同)

Kon*_*lph 34

是的,使用Array#sort!它很容易.

myarray.sort! { |a, b|  a.attribute <=> b.attribute }
Run Code Online (Sandbox Code Playgroud)

  • 是否有created_at方法来访问@created_at属性?@created_at是什么类型的对象?它定义了`<=>`吗?你得到了什么样的错误?等等,广告恶心.换句话说,我们需要更多的细节而不是"但对我来说没有运气". (4认同)

shi*_*mar 26

升序:

objects_array.sort! { |a, b|  a.attribute <=> b.attribute }
Run Code Online (Sandbox Code Playgroud)

要么

objects_array.sort_by{ |obj| obj.attribute }
Run Code Online (Sandbox Code Playgroud)

降序排列 :

objects_array.sort! { |a, b|  b.attribute <=> a.attribute }
Run Code Online (Sandbox Code Playgroud)

要么

objects_array.sort_by{ |obj| obj.attribute }.reverse
Run Code Online (Sandbox Code Playgroud)


bum*_*mbu 20

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

myarray.sort{ |a,b| (a.attr1 == b.attr1) ? a.attr2 <=> b.attr2 : a.attr1 <=> b.attr1 }
Run Code Online (Sandbox Code Playgroud)

或者在数组数组的情况下

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


小智 14

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

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
Run Code Online (Sandbox Code Playgroud)

现在,一个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" ]
Run Code Online (Sandbox Code Playgroud)


Cur*_*son 10

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

myarray.sort! { |a, b|  a.attribute <=> b.attribute }
Run Code Online (Sandbox Code Playgroud)

但是,您需要确保<=>为该属性实现了运算符.如果它是Ruby本机数据类型,这不是问题.否则,编写自己的实现,如果a <b则返回-1,如果相等则返回0,如果a> b则返回1.


Noa*_*vis 9

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