按值排序散列哈希(并返回散列,而不是数组)

Dha*_*udi 11 ruby sorting hash data-structures

我有以下哈希:

user = {
  'user' => {
    'title' => {'weight' => 1, .... }
    'body' => {'weight' => 4, ....}
     ....
     ....
  }
}
Run Code Online (Sandbox Code Playgroud)

有可能让用户按其子哈希的权重键排序吗?

我查看了Hash.sort,但它看起来像是返回数组而不是我原来的哈希排序.

mol*_*olf 11

在Ruby 1.9,HashES进行排序,但Hash#sort仍返回ArrayArray秒.设想!它确实意味着您可以在它之上构建自己的排序方法.

class Hash
  def sorted_hash(&block)
    self.class[sort(&block)]   # Hash[ [[key1, value1], [key2, value2]] ]
  end
end
Run Code Online (Sandbox Code Playgroud)

Hashes在Ruby 1.8中未分类.如果您想要Ruby 1.8兼容性,可以使用ActiveSupport OrderedHash.它的行为类似于1.9- Hash,因此您可以sorted_hash在其上定义相同的方法:

class ActiveSupport::OrderedHash
  def sorted_hash(&block)
    self.class[sort(&block)]
  end
end

hash = ActiveSupport::OrderedHash.new
hash["b"] = "b"
hash["a"] = "a"
hash               #=> {"b"=>"b", "a"=>"a"}  => unsorted
hash.sorted_hash   #=> {"a"=>"a", "b"=>"b"}  => sorted!
Run Code Online (Sandbox Code Playgroud)

您必须将sorted_hash方法复制到您的代码中,因为默认情况下它不存在!

深度排序的更新: 如果您希望对除散列键之外的其他内容进行排序,请将块传递给sorted_hash方法,如下所示(假设从上面开始实现):

hash = ActiveSupport::OrderedHash.new
hash["a"] = { "attr" => "2", "..." => "..." }
hash["b"] = { "attr" => "1", "..." => "..." }

# Unsorted.
hash 
  #=> {"a"=>{"attr"=>"2", "..."=>"..."}, "b"=>{"attr"=>"1", "..."=>"..."}}

# Sort on the "attr" key. (Assuming every value is a Hash itself!)
hash.sorted_hash { |a, b| a[1]["attr"] <=> b[1]["attr"] }
  #=> {"b"=>{"attr"=>"1", "..."=>"..."}, "a"=>{"attr"=>"2", "..."=>"..."}}
Run Code Online (Sandbox Code Playgroud)


Jim*_*uls 8

哈希基本上是未分类的数据结构; Hash#sort确实是你想要的.要么是这样,要么对键列表进行排序,然后使用它来枚举何时输出哈希值,而不是使用自己的方法直接枚举哈希值.

  • 从技术上讲,Hashes是在Ruby 1.9中订购的.但我认为将它们视为不是一般情况通常更好,因为支持重新排序并且不存在. (3认同)