如何在哈希数组中获取特定键?

问题描述 投票:0回答:3

我有一系列哈希:

[{"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一直没有循环。

arrays ruby hash
3个回答
2
投票

您可以首先使用不同的方法:

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

Demonstration

group_bytransform_values

collection.
  group_by { |item| item.first.first.to_sym  }.
  transform_values { |values| values.flat_map(&:values) }

2
投票

您可以通过以下方式解决问题:

elem = [{"folder"=>["j", "b"]}, {"path"=>["p"]}]
merged = elem.reduce({}, :merge)
# => {"folder" => ["j", "b"], "path" => ["p"]}
merged["folder"]
# => ["j", "b"]
merged["path"]
# => ["p"]

2
投票
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")
© www.soinside.com 2019 - 2024. All rights reserved.