我有一个哈希数组,我想按值之一进行排序。但是,如果两个哈希具有相同的值,则希望将它们按第二个(备份)值排序。
在下面的示例中,我想基于“ a”的值对哈希进行排序。如果两个元素的“ a”值相同,我想按“ b”的值进行排序作为备份。
# Notice the first and last hashes have the same value for "a"
hashes = [
{a: 2, b: 7},
{a: 1, b: 0},
{a: 9, b: 6},
{a: 2, b: 8}
]
输出
{a: 1, b: 0},
{a: 2, b: 7},
{a: 2, b: 8},
{a: 9, b: 6}
答案 0 :(得分:3)
我认为将#sort_by
与#values_at
结合使用非常容易
hashes.sort_by { |e| e.values_at(:a, :b) }
=> [{:a=>1, :b=>0},
{:a=>2, :b=>7},
{:a=>2, :b=>8},
{:a=>9, :b=>6}]
它也可能会扩展,例如,您具有带有3个键的哈希数组:
hashes = [
{a: 2, b: 7, c: 8},
{a: 1, b: 0, c: 5},
{a: 9, b: 6, c: 6},
{a: 2, b: 7, c: 3}
]
然后:
hashes.sort_by { |e| e.values_at(:a, :b, :c) }
=> [{:a=>1, :b=>0, :c=>5},
{:a=>2, :b=>7, :c=>3},
{:a=>2, :b=>7, :c=>8},
{:a=>9, :b=>6, :c=>6}]
答案 1 :(得分:0)
请尝试以下操作:
hashes.sort { |hash1, hash2| [hash1[:a], hash1[:b]] <=> [hash2[:a], hash2[:b]]}