Rails - 根据子哈希值对散列哈希值进行排序

时间:2014-11-27 14:53:01

标签: ruby-on-rails sorting hash

我有以下哈希:

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"}, 
         }
     }

3 个答案:

答案 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!

我不能说出效率,但它确实有效。