这是对哈希进行排序并返回hash对象(而不是Array)的最佳方法吗?
h = {"a"=>1, "c"=>3, "b"=>2, "d"=>4}
# => {"a"=>1, "c"=>3, "b"=>2, "d"=>4}
Hash[h.sort]
# => {"a"=>1, "b"=>2, "c"=>3, "d"=>4}
这是对哈希进行排序并返回hash对象(而不是Array)的最佳方法吗?
h = {"a"=>1, "c"=>3, "b"=>2, "d"=>4}
# => {"a"=>1, "c"=>3, "b"=>2, "d"=>4}
Hash[h.sort]
# => {"a"=>1, "b"=>2, "c"=>3, "d"=>4}
当前回答
按键排序哈希,在Ruby中返回哈希
与解构和哈希#排序
hash.sort { |(ak, _), (bk, _)| ak <=> bk }.to_h
可列举的# sort_by
hash.sort_by { |k, v| k }.to_h
使用默认行为进行哈希排序
h = { "b" => 2, "c" => 1, "a" => 3 }
h.sort # e.g. ["a", 20] <=> ["b", 30]
hash.sort.to_h #=> { "a" => 3, "b" => 2, "c" => 1 }
注意:< Ruby 2.1
array = [["key", "value"]]
hash = Hash[array]
hash #=> {"key"=>"value"}
注:> Ruby 2.1
[["key", "value"]].to_h #=> {"key"=>"value"}
其他回答
我喜欢之前帖子中的解决方案。
我做了一个迷你类,叫它class AlphabeticalHash。它还有一个叫做ap的方法,它接受一个参数,一个Hash,作为输入:ap变量。类似于pp (pp变量)
但它将(试着)按字母顺序打印(它的键)。不知道是否有人想使用这个,它是一个gem,你可以这样安装它:gem install alphabetical_hash
对我来说,这很简单。如果其他人需要更多的功能,让 我知道,我会把它加进宝石里的。
编辑:这要归功于彼得,是他给了我这个想法。:)
我一直使用sort_by。您需要用Hash[]包装#sort_by输出以使其输出散列,否则它将输出数组的数组。另外,要实现这一点,您可以在元组数组上运行#to_h方法,将它们转换为k=>v结构(哈希)。
hsh ={"a" => 1000, "b" => 10, "c" => 200000}
Hash[hsh.sort_by{|k,v| v}] #or hsh.sort_by{|k,v| v}.to_h
在“如何根据数值对Ruby哈希进行排序?”中有一个类似的问题。
我也遇到过同样的问题(我必须把我的设备按名字分类),我是这样解决的:
<% @equipments.sort.each do |name, quantity| %>
...
<% end %>
@equipments是我在模型上构建并返回到控制器上的哈希值。如果你调用.sort,它会根据它的键值对哈希进行排序。
按键排序哈希,在Ruby中返回哈希
与解构和哈希#排序
hash.sort { |(ak, _), (bk, _)| ak <=> bk }.to_h
可列举的# sort_by
hash.sort_by { |k, v| k }.to_h
使用默认行为进行哈希排序
h = { "b" => 2, "c" => 1, "a" => 3 }
h.sort # e.g. ["a", 20] <=> ["b", 30]
hash.sort.to_h #=> { "a" => 3, "b" => 2, "c" => 1 }
注意:< Ruby 2.1
array = [["key", "value"]]
hash = Hash[array]
hash #=> {"key"=>"value"}
注:> Ruby 2.1
[["key", "value"]].to_h #=> {"key"=>"value"}
在Ruby 2.1中,它很简单:
h.sort.to_h