Ruby数组映射不以所需形式输出

时间:2014-12-22 11:02:27

标签: ruby arrays dictionary

很抱歉问,但我有点挣扎。基本上我有以下功能:

weekly_reach_data = weekly_reach_arr.map do |data| [
    {
       name: "DCable",
       data: {x: data['Graph numerics'].to_i, y: data['DCable'].to_f}
    },
    {
        name: "DSat",
        data: {x: data['Graph numerics'].to_i, y: data['DSat'].to_f}
    },
    {
        name: "DTT",
        data: {x: data['Graph numerics'].to_i, y: data['DTT'].to_f}
    }
]

end

以这种形式输出数据:

{:name=>"DCable", :data=>{:x=>1, :y=>1.8}}
{:name=>"DSat", :data=>{:x=>1, :y=>7.48}}
{:name=>"DTT", :data=>{:x=>1, :y=>5.81}}
{:name=>"DCable", :data=>{:x=>2, :y=>2.29}}
{:name=>"DSat", :data=>{:x=>2, :y=>7.74}}
{:name=>"DTT", :data=>{:x=>2, :y=>5.82}} etc

但是,我要求数据采用以下格式:

{:name=>"DCable", :data=>[{:x=>1, :y=>2}, {:x=>2, :y=>3}]}
{:name=>"DSat", :data=>[{:x=>1, :y=>5}, {:x=>2, :y=>8}]}
{:name=>"DTT", :data=>[{:x=>1, :y=>3}, {:x=>2, :y=>9}]}

如您所见,前者是循环并创建多个条目。有谁知道如何重建地图函数以这种形式输出?

Weekly_reach_arr是这种形式的数组:

{"Graph numerics"=>"1", "Users"=>"S", "All platforms"=>"14.99", "DSat"=>"7.48", "DTT"=>"5.81", "DCable"=>"1.80", "% Reach"=>"S", "Target"=>"33.33%"}
{"Graph numerics"=>"2", "Users"=>"O", "All platforms"=>"15.60", "DSat"=>"7.74", "DTT"=>"5.82", "DCable"=>"2.29", "% Reach"=>"O", "Target"=>"33.33%"}
{"Graph numerics"=>"3", "Users"=>"N", "All platforms"=>"16.83", "DSat"=>"7.78", "DTT"=>"6.65", "DCable"=>"2.52", "% Reach"=>"N", "Target"=>"33.33%"}
{"Graph numerics"=>"4", "Users"=>"D", "All platforms"=>"16.27", "DSat"=>"7.64", "DTT"=>"7.01", "DCable"=>"1.68", "% Reach"=>"D", "Target"=>"33.33%"}... etc

2 个答案:

答案 0 :(得分:3)

进行了一些编辑,但我认为以下是最简洁的版本:

%w{DCable DSat DTT}.map do |name|
  weekly_reach_arr.each_with_object({name: name, data: []}) do |data, hash|
    hash[:data] << {x: data['Graph numerics'].to_i, y: data[name].to_f}
  end
end

答案 1 :(得分:0)

您可能会略微压扁生成的字典并使用

result = Hash.new { |h,k| h[k] = [] }

weekly_reach_arr.each do |data|
  %w(DSat DTT DCable).each do |key|
    result[key] << { x: data["Graph numerics"].to_i, y: data[key].to_f }  
  end
end

会给出

{"DSat"=>
  [{:x=>1, :y=>7.48},
   {:x=>2, :y=>7.74},
   {:x=>3, :y=>7.78},
   {:x=>4, :y=>7.64}],
 "DTT"=>
  [{:x=>1, :y=>5.81},
   {:x=>2, :y=>5.82},
   {:x=>3, :y=>6.65},
   {:x=>4, :y=>7.01}],
 "DCable"=>
  [{:x=>1, :y=>1.80},
   {:x=>2, :y=>2.29},
   {:x=>3, :y=>2.52},
   {:x=>4, :y=>1.68}]}

您可以随时map使用

来回复您的需求
result.map { |key, value|
  { name: key, data: value }
}

给出了

{:name=>"DSat", :data=>[{:x=>1, :y=>7.48}, {:x=>2, :y=>7.74}, {:x=>3, :y=>7.78}, {:x=>4, :y=>7.64}]}
{:name=>"DTT", :data=>[{:x=>1, :y=>5.81}, {:x=>2, :y=>5.82}, {:x=>3, :y=>6.65}, {:x=>4, :y=>7.01}]}
{:name=>"DCable", :data=>[{:x=>1, :y=>1.8}, {:x=>2, :y=>2.29}, {:x=>3, :y=>2.52}, {:x=>4, :y=>1.68}]}