是否可以按子键的值对父哈希值进行排序?
例如:
{
:a =>
{:order => 3},
:b =>
{:order => 1},
:c =>
{:order => 2}
}
诉诸
{
:b =>
{:order => 1},
:c =>
{:order => 2},
:a =>
{:order => 3}
}
答案 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
方法都会根据源哈希中的排序键值对创建新哈希。
最佳