这是对哈希进行排序并返回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 2.1中,它很简单:

h.sort.to_h

其他回答

你可以使用sort方法,然后用to_h方法将数组转换回哈希

h = { "a" => 1, "c" => 3, "b" => 2, "d" => 4 }
h.sort.to_h
# => { "a" => 1, "b" => 2, "c" => 3, "d" => 4 }

在Ruby 2.1中,它很简单:

h.sort.to_h

我一直使用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哈希进行排序?”中有一个类似的问题。

@ordered = {}
@unordered.keys.sort.each do |key|
  @ordered[key] = @unordered[key]
end

我也遇到过同样的问题(我必须把我的设备按名字分类),我是这样解决的:

<% @equipments.sort.each do |name, quantity| %>
...
<% end %>

@equipments是我在模型上构建并返回到控制器上的哈希值。如果你调用.sort,它会根据它的键值对哈希进行排序。