如何从数组中获取哈希值

时间:2015-04-07 07:46:06

标签: ruby arrays hash

输入: -

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"]} 

我如何获得预期的输出?

3 个答案:

答案 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'] }

Try it online

答案 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"]}