输入: -
array = [{"name"=>"id", "value"=>"123"},
{"name"=>"type", "value"=>"app"},
{"name"=>"codes", "value"=>"12"},
{"name"=>"codes", "value"=>"345"},
{"name"=>"type", "value"=>"app1"}]
sample_hash = {}
功能: -
array.map {|f| sample_hash[f["name"]] = sample_hash[f["value"]] }
结果: -
sample_hash
=> {"id"=>"123", "type"=>"app", "codes"=>"345"}
但我需要预期的结果如下: -
sample_hash
=> {"id"=>"123", "type"=>["app","app1"], "codes"=>["12", "345"]}
我如何获得预期的输出?
答案 0 :(得分:1)
您可以使用sample_hash
Hash构造函数初始化new {|hash, key| block }
,以使默认情况下将此哈希值中的值初始化为空数组。
这使得在第二阶段更容易,其中初始数据集中的每个值都附加到索引在相应的"名称"之后的值数组中:
sample_hash = Hash.new { |h, k| h[k] = [] }
array.each { |f| sample_hash[f['name']] << f['value'] }
答案 1 :(得分:1)
@ w0lf是正确的。相同但不同的结构。
array.each_with_object({}) do |input_hash, result_hash|
(result_hash[input_hash['name']] ||= []) << input_hash['value']
end
答案 2 :(得分:0)
见:
array.inject({}) do |ret, a|
ret[a['name']] = ret[a['name']] ? [ret[a['name']], a['value']] : a['value']
ret
end
o / p:{"id"=>"123", "type"=>["app", "app1"], "codes"=>["12", "345"]}