Ruby on rails ruby中使用自定义比较器对哈希进行排序

Ruby on rails ruby中使用自定义比较器对哈希进行排序,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我有一个哈希数组,它应该很容易排序,但由于我对ruby非常陌生,并且仍在研究文档,所以我在排序一个哈希时遇到了一些问题,该哈希几乎没有键值组合,但需要基于多个键值进行排序 [{:attr1 => 3, :attr2 => 'test', attr3 => 'test2'}, {:attr1 => 1, :attr2 => 'test', attr3 => nil}, {:attr1 => 1, :attr2 => 'test', attr3 =

我有一个哈希数组,它应该很容易排序,但由于我对ruby非常陌生,并且仍在研究文档,所以我在排序一个哈希时遇到了一些问题,该哈希几乎没有键值组合,但需要基于多个键值进行排序

[{:attr1 => 3, :attr2 => 'test', attr3 => 'test2'}, 
{:attr1 => 1, :attr2 => 'test', attr3 => nil}, 
{:attr1 => 1, :attr2 => 'test', attr3 => 'test3'},
{:attr1 => 2, :attr2 => 'test', attr3 => 'test3'}]
所以我想按照海关规定对它进行分类。自定义规则是首先查看
attr1
,然后根据它按降序排序

如果存在相同的
attr1
值,但其中一个
attr3
nil
,则最后订购具有nil的值

所以我认为我需要创建自定义比较器,或者不需要。我怎样才能用最少的痛苦做到这一点

如果要对其进行排序,它将如下所示:

[{:attr1 => 3, :attr2 => 'test', attr3 => 'test2'}, 
    {:attr1 => 2, :attr2 => 'test', attr3 => 'test3'},
    {:attr1 => 1, :attr2 => 'test', attr3 => 'test3'},
    {:attr1 => 1, :attr2 => 'test', attr3 => nil}
]

最简单的方法是按最后一个字段拆分并独立排序(假设您也需要最后一个属性为nil sorted的值):


什么是属性3?在使用局部变量或方法之前,必须先定义它们。
array.partition{|h| !h[:attr3].nil?}.map{|ar| ar.sort_by{|h| -h[:attr1]}}.flatten 
array.sort_by{|h| [-h[:attr1], h[:attr3].nil?? 1 : 0]}