微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有以下哈希:
user = {
  'user' => {
    'title' => {'weight' => 1,.... }
    'body' => {'weight' => 4,....}
     ....
     ....
  }
}

是否可以让用户按其孩子哈希值的权重键排序?

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

解决方法

在Ruby 1.9中,Hash是排序的,但是Hash#sort仍然返回一个数组.想象一下!这意味着您可以在其上构建自己的排序方法.
class Hash
  def sorted_hash(&block)
    self.class[sort(&block)]   # Hash[ [[key1,value1],[key2,value2]] ]
  end
end

Ruby 1.8中没有哈希值.如果您希望使用Ruby 1.8兼容性,则可以使用ActiveSupport的OrderedHash.它的行为类似于1.9哈希,因此您可以在其上定义相同的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!

您必须将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","..."=>"..."}}

原文地址:https://www.jb51.cc/ruby/270918.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐