是否可以通过子哈希值对多维哈希进行排序?

时间:2017-07-19 22:24:53

标签: ruby hash

是否可以按子键的值对父哈希值进行排序?

例如:

{
    :a => 
        {:order => 3},
    :b =>
        {:order => 1},
    :c =>
        {:order => 2}
}

诉诸

{
    :b => 
        {:order => 1},
    :c =>
        {:order => 2},
    :a =>
        {:order => 3}
}

2 个答案:

答案 0 :(得分:4)

您可以将其转换为对数组,使用sort_by方法定位要排序的值,然后将其转换回哈希值:

h = {
    :a => 
        {:order => 3},
    :b =>
        {:order => 1},
    :c =>
        {:order => 2}
}

h.sort_by {|k,v| v[:order]}.to_h
=> {:b=>{:order=>1}, :c=>{:order=>2}, :a=>{:order=>3}} 

答案 1 :(得分:4)

请记住,Ruby哈希可以拥有的唯一顺序是基于广告订单。您需要创建一个新的哈希(无sort!)并按您希望的顺序按元素创建新的哈希元素。

假设:

> hash
=> {:a=>{:order=>3}, :b=>{:order=>1}, :c=>{:order=>2}}

您可以使用.sort_by执行:

> hash.sort_by {|k, h| h[:order]}.to_h
=> {:b=>{:order=>1}, :c=>{:order=>2}, :a=>{:order=>3}}

您还可以通过解包与通常.sort相关联的参数,将更经典的<=>与太空船a,b结合使用:

> hash.sort {|(a,ha),(b,hb)| ha[:order] <=> hb[:order] }.to_h
=> {:b=>{:order=>1}, :c=>{:order=>2}, :a=>{:order=>3}}

在任何一种情况下,.to_h方法都会根据源哈希中的排序键值对创建新哈希。

最佳