如何在rails中对哈希进行排序

Kav*_*cat 6 ruby arrays hash ruby-on-rails-3

我有一个哈希

x= {
  "1"=>{:name=>"test1", :age=>"1"}, 
  "5"=>{:name=>"test2", :age=>"5"}, 
  "2"=>{:name=>"test3", :age=>"2"}, 
  "4"=>{:name=>"test4", :adn=>"4"}, 
  "3"=>{:name=>"test5", :adn=>"3"}
 }
Run Code Online (Sandbox Code Playgroud)

期望输出

x= {
  "1"=>{:name=>"test1", :age=>"1"}, 
  "2"=>{:name=>"test3", :age=>"2"}, 
  "3"=>{:name=>"test5", :age=>"3"}, 
  "4"=>{:name=>"test4", :adn=>"4"}, 
  "5"=>{:name=>"test2", :adn=>"5"}
 }
Run Code Online (Sandbox Code Playgroud)

到目前为止,我尝试做 x.sort.flatten 并且我得到了

[
  "1", {:name=>"test1", :age=>"1"}, 
  "2", {:name=>"test3", :age=>"2"}, 
  "3", {:name=>"test5", :adn=>"3"}, 
  "4", {:name=>"test4", :adn=>"4"}, 
  "5", {:name=>"test2", :age=>"5"}
]
Run Code Online (Sandbox Code Playgroud)

Car*_*and 1

这里有一些其他方法可以做到这一点。

x.keys.sort_by(&:to_i).each_with_object({}) { |k,h| h[k] = x[k] }
  #=> {"1"=>{:name=>"test1", :age=>"1"},
  #    "2"=>{:name=>"test3", :age=>"2"},
  #    "3"=>{:name=>"test5", :adn=>"3"},
  #    "4"=>{:name=>"test4", :adn=>"4"},
  #    "5"=>{:name=>"test2", :age=>"5"}} 
Run Code Online (Sandbox Code Playgroud)

或者

k = x.keys.sort_by(&:to_i)
k.zip(x.values_at(*k)).to_h
Run Code Online (Sandbox Code Playgroud)

如果x要修改,

x.keys.sort_by(&:to_i).each { |k| x[k] = x.delete(k) }
x
Run Code Online (Sandbox Code Playgroud)