我有以下哈希:
h = { "people"=>
{ "joe" => { "score" => 3, "favorite_food" => "pizza"},
"marry" => { "score" => 89, "favorite_food" => "ice_cream" }
}
}
如何根据得分对此哈希进行排序(并保持排序)?
即:结果将是:
{ "people"=>
{
"marry" => { "score" => 89, "favorite_food" => "ice_cream" }
"joe" => { "score" => 3, "favorite_food" => "pizza"},
}
}
答案 0 :(得分:1)
如果你的意思是哈希值的评估顺序,那么你必须重建子哈希:
h[ 'people' ].replace(h[ 'people' ].to_a.sort do |x, y|
y[1][ 'score' ] <=> x[1][ 'score' ]
end.to_h)
对于旧版本的ruby,请使用Hash
构造函数:
h[ 'people' ].replace( Hash[h[ 'people' ].to_a.sort do |x, y|
y[1][ 'score' ] <=> x[1][ 'score' ]
end] )
附加说明:有序哈希出现在ruby 2.1版本中(据我记得)。
答案 1 :(得分:1)
如果你更喜欢更加自我解释(和更长)的代码,你可以将哈希的散列(让我们称之为h
)转换为哈希数组(让我们称之为哈希) a
)包含您要排序但略有不同的所有元素,然后对此数组元素执行排序 - 使用您喜欢的任何键:
a = []
p["people"].each do |p|
a << { :name => p, :score => p["score"], :food => p["food"] }
end
sorted = a.sort_by { |e| e[:score] }
答案 2 :(得分:0)
所以,为了完成,这是另一种排序方式:
h.deep_symbolize_keys!
h[:people].sort_by {|k,v| v[:score]}.reverse!
我不能说出效率,但它确实有效。