如何在哈希数组中获取特定键?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在哈希数组中获取特定键?相关的知识,希望对你有一定的参考价值。
我有一系列哈希:
[{"folder"=>"j"}, {"path"=>"p"}, {"folder"=>"b"}]
我合并他们:
flat_map(&:entries)
.group_by(&:first)
.map{|k,v| Hash[k, v.map(&:last)]}
然后我得到:
[{"folder"=>["j", "b"]}, {"path"=>["p"]}]
正如所料。
我的问题是,:folder
和:path
(我也会有更多的钥匙)可以随机订购。而不是循环和检查键名,是否可以单独获取每个哈希?例如;
# After merging...
folders = elem[:folder] # => ["j", "b"]
paths = elem[:path].. # => ["p"]
基本上我想让:folder
和:path
一直没有循环。
答案
您可以首先使用不同的方法:
collection = [{"folder"=>"j"}, {"path"=>"p"}, {"folder"=>"b"}]
使用each_with_object
(或与reduce
类似的方法):
collection.each_with_object({}) do |values, s|
values.each do |key, value|
(s[key.to_sym] ||= []) << value
end
end
或group_by
和transform_values
:
collection.
group_by { |item| item.first.first.to_sym }.
transform_values { |values| values.flat_map(&:values) }
另一答案
您可以通过以下方式解决问题:
elem = [{"folder"=>["j", "b"]}, {"path"=>["p"]}]
merged = elem.reduce({}, :merge)
# => {"folder" => ["j", "b"], "path" => ["p"]}
merged["folder"]
# => ["j", "b"]
merged["path"]
# => ["p"]
另一答案
ar =[{"folder"=>"j"}, {"path"=>"p"}, {"folder"=>"b"}]
elem = Hash.new{[]}
ar.each{|hash| hash.each{|k,v| elem[k] <<= v }}
folders, paths = elem.values_at("folder", "path")
以上是关于如何在哈希数组中获取特定键?的主要内容,如果未能解决你的问题,请参考以下文章