2

我有一个哈希数组,应该很容易排序,但是由于我对 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的值,但其中之一attr3nil最后排序为 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}
]
4

2 回答 2

5
array.sort_by{|h| [-h[:attr1], h[:attr3].nil?? 1 : 0]}
于 2013-06-26T15:29:31.240 回答
2

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

array.partition{|h| !h[:attr3].nil?}.map{|ar| ar.sort_by{|h| -h[:attr1]}}.flatten 
于 2013-06-26T15:08:25.217 回答