gpt4 book ai didi

ruby - 按值对 Hash of Hashes 进行排序(并返回哈希,而不是数组)

转载 作者:数据小太阳 更新时间:2023-10-29 06:43:30 28 4
gpt4 key购买 nike

我有以下哈希:

user = {
'user' => {
'title' => {'weight' => 1, .... }
'body' => {'weight' => 4, ....}
....
....
}
}

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

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

最佳答案

在 Ruby 1.9 中,Hashes 被排序,但是 Hash#sort 仍然返回 ArrayArray秒。想象一下!它确实意味着您可以在此基础上构建自己的排序方法。

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

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!

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

深度排序更新:如果您希望对散列键之外的其他内容进行排序,请将一个 block 传递给 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", "..."=>"..."}}

关于ruby - 按值对 Hash of Hashes 进行排序(并返回哈希,而不是数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/983444/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com