如何遍历对Ruby中的键进行排序的哈希数组

时间:2017-12-10 03:38:30

标签: arrays ruby loops hash

我有一系列像这样的哈希:

items = [{"id"=>"123", "code"=>"abc","name"=>"test", "type"=>["good"]},
   {"id"=>"555", "code"=>"ddd","name"=>"foo", "type"=>["better"]},
   {"id"=>"098", "code"=>"zyx","name"=>"bar", "type"=>["best"]}]

我试图通过密钥对数组中的每个哈希进行排序。

我试过了:

items.each { |item| item = item.sort.to_h }

它返回相同的结果:

 [{"id"=>"123", "code"=>"abc", "name"=>"test", "type"=>["good"]},
 {"id"=>"555", "code"=>"ddd", "name"=>"foo", "type"=>["better"]},
 {"id"=>"098", "code"=>"zyx", "name"=>"bar", "type"=>["best"]}]

但是当我尝试这个时:

items[0].sort.to_h

这是结果:

 {"code"=>"abc", "id"=>"123", "name"=>"test", "type"=>["good"]}

所以看起来当我使用items调用items[x]中的各个元素时,其中x是数组中的索引值,它会对其进行排序。 但我需要一个解决方案来遍历每个元素,并保存排序。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我解决了这个问题:

items.map { |item| item.sort.to_h } 

感谢@SagarPandya和@Dark

答案 1 :(得分:0)

如果在示例中,所有哈希都具有相同的键,则对键执行单个排序会更快。

sorted_keys = items.first.keys.sort
  #=> ["code", "id", "name", "type"]
items.map { |item| sorted_keys.each_with_object({}) { |k,h| h[k] = item[k] } }
  #=> [{"code"=>"abc", "id"=>"123", "name"=>"test", "type"=>["good"]},
  #    {"code"=>"ddd", "id"=>"555", "name"=>"foo", "type"=>["better"]},
  #    {"code"=>"zyx", "id"=>"098", "name"=>"bar", "type"=>["best"]}]

最后一行也可以写成

items.map { |item| sorted_keys.zip(item.values_at(*sorted_keys)).to_h }