我有以下散列:
h = { "people"=>
{ "joe" => { "score" => 3, "favorite_food" => "pizza"},
"marry" => { "score" => 89, "favorite_food" => "ice_cream" }
}
}如何根据分数对这个散列进行排序(并保持排序)?
ie:结果是:
{ "people"=>
{
"marry" => { "score" => 89, "favorite_food" => "ice_cream" }
"joe" => { "score" => 3, "favorite_food" => "pizza"},
}
}发布于 2014-11-27 15:05:10
如果您是指哈希值的计算顺序,则必须重构子哈希:
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] )附加注意事项:有序散列出现在rubyVersion2.1中(据我所知)。
发布于 2014-11-27 15:39:57
如果您希望代码更清晰(更长),则可以将散列哈希(让我们称之为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] }发布于 2014-11-27 23:03:19
因此,为了完成任务,下面是另一种排序方法:
h.deep_symbolize_keys!
h[:people].sort_by {|k,v| v[:score]}.reverse!我不能对这件事的效率发表意见,但它有效。
https://stackoverflow.com/questions/27173430
复制相似问题