Ruby 是否可以按子哈希值对多维哈希进行排序?
是否可以按子键的值对父哈希进行排序 例如:Ruby 是否可以按子哈希值对多维哈希进行排序?,ruby,hash,Ruby,Hash,是否可以按子键的值对父哈希进行排序 例如: { :a => {:order => 3}, :b => {:order => 1}, :c => {:order => 2} } 求助于 { :b => {:order => 1}, :c => {:order => 2}, :a =>
{
:a =>
{:order => 3},
:b =>
{:order => 1},
:c =>
{:order => 2}
}
求助于
{
:b =>
{:order => 1},
:c =>
{:order => 2},
:a =>
{:order => 3}
}
您可以将其转换为成对数组,使用方法以要排序的值为目标,然后将其转换回哈希:
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}}
请记住,Ruby哈希的唯一顺序是基于插入顺序的。您需要创建一个新的散列(no
sort!
),并按照您希望的顺序逐个元素创建新的散列
鉴于:
> hash
=> {:a=>{:order=>3}, :b=>{:order=>1}, :c=>{:order=>2}}
您可以使用.sort\u 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}}
hash.sort{|(a,ha),(b,hb)| ha[:order]hb[:order]}.to|h
=>{:b=>{:order=>1},:c=>{:order=>2},:a=>{:order=>3}
在这两种情况下,.to_h
方法都会基于源哈希中已排序的键、值对创建一个新的哈希
最好接近,但如果这是目标,你需要将它们重新组合成散列。我只是在事后才注意到这一点。到那时,其他人已经这样做了。请记住,散列是用于未排序的容器的。Ruby只支持一种排序方法:插入顺序。