我有一系列像这样的哈希:
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
是数组中的索引值,它会对其进行排序。
但我需要一个解决方案来遍历每个元素,并保存排序。
有什么想法吗?
答案 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 }