【问题标题】:Ruby array map not outputting in required formRuby数组映射未以所需形式输出
【发布时间】:2015-02-20 11:24:57
【问题描述】:

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

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

【问题讨论】:

  • weekly_reach_arr 是什么样的?
  • 添加到问题中,谢谢:)
  • 是否需要完全这样输出?您可能会丢失namedata 键并将其展平为Hash,其中name 作为键,data 作为值
  • 不幸的是,是的。我把它推到一个 Dashing Rickshaw Graph 上。 Rickshaw 只接受特定样式的数组。

标签: ruby arrays dictionary


【解决方案1】:

做了一些修改,但我认为以下是最简洁的版本:

%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

【讨论】:

    【解决方案2】:

    你可能会失去稍微展平结果字典并使用

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

    【讨论】:

    • 太棒了。完美运行。谢谢
    • @Humza 的回答更简洁——我建议您使用那个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2013-03-21
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 2020-06-08
    相关资源
    最近更新 更多