基于两个属性对哈希数组进行排序

时间:2020-09-21 07:24:05

标签: ruby

我有一个哈希数组,我想按值之一进行排序。但是,如果两个哈希具有相同的值,则希望将它们按第二个(备份)值排序。

在下面的示例中,我想基于“ 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}

2 个答案:

答案 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]]}
相关问题