【问题标题】:Help with transforming arrays and hashes帮助转换数组和哈希
【发布时间】:2011-04-10 20:50:52
【问题描述】:

我正在尝试在我的网络应用程序中使用 Highcharts,但是我在让我的数组匹配 hightcharts 需要的输出时遇到了一些问题,本质上 hightcharts 在它的 JS 中需要这样的输出:

series: [{
   name: 'person',
   data: [1562, 873, 1457]
}, {
   name: 'car',
   data: [7323, 324, 1233]
}, {
   name: 'SUV',
   data: [832, 6232, 4432]
}]

在这种情况下,数据数组中的每个项目都是新的一天,我的问题是我的数据的组织方式有点不同,尝试转换我的数据以匹配这一点一直很头疼。基本上我的输出是这样的:

[
  {:date=>"Sun, 10 Apr 2011", :object_types=>[
    {:count=>4279, :class_name=>"person"}, 
    {:count=>8785, :class_name=>"car"}, 
    {:count=>2153, :class_name=>"SUV"}
  ]}, 
  {:date=>"Sat, 09 Apr 2011", :object_types=>[
    {:count=>12206, :class_name=>"person"}, 
    {:count=>29095, :class_name=>"car"}, 
    {:count=>7565, :class_name=>"SUV"}
  ]}, 
  {:date=>"Fri, 08 Apr 2011", :object_types=>[
    {:count=>4159, :class_name=>"person"}, 
    {:count=>8043, :class_name=>"car"}, 
    {:count=>1982, :class_name=>"SUV"}
  ]}
] 

因此,似乎我首先需要将项目首先按(在我的情况下):class_name 分组,然后在 :count 中按天分组为 data 中的每个项目。

我很难找到优雅地做到这一点的“红宝石方式”,正如你可能看到的那样,我在操作数组和哈希方面并不是非常出色,但是在指导我正确地完成这个方面有任何帮助方式值得赞赏。


其次,我最初尝试在我的查询中使用group() 来完成此操作,但这似乎并没有多大帮助,你想吗?我必须解决的另一件事是在没有记录的情况下用“0”填充日期......但我认为接下来我会解决这个问题。

【问题讨论】:

    标签: ruby arrays hash


    【解决方案1】:

    我会使用Enumerable#group_by,因为那是更难的部分;剩下的只是基本的改造:

    r = data.flat_map{|h| h[:object_types]}.
      group_by{|h| h[:class_name]}.
      map do |class_name, hashes|
        {:name => class_name, :data => hashes.map{|h| h[:count]}}
      end
    

    注意group_by 在 ActiveRecord 或 Ruby 1.8.7+ 中。 flat_map 是 Ruby 1.9.2 的新成员。使用正确的版本,或require "backports"

    【讨论】:

      【解决方案2】:

      这样的事情应该可以工作:

      def convert_data(input) 
        hash = {} 
        input.each do |o| 
          o[:object_types].each do |ot| 
            if hash[ot[:class_name]] 
              hash[ot[:class_name]] << ot[:count] 
            else 
              hash[ot[:class_name]] = [ot[:count]] 
            end 
          end 
        end 
        hash.map {|k,v| {'name' => k, 'data' => v}}
      end
      

      您可以使用输入数据调用此函数,并且您已经获得了一个符合您期望的 Highcharts 库格式的对象。

      【讨论】:

        【解决方案3】:
        aux = Hash.new(Array.new)
        series = Array.new
        
        # After this code the aux hash will look something like this: {:person => [4159, 1231, 255], :suv => [1231, 4123, 5411], :car => [321, 312, 541]}
        raw_array.each do |date_hash|
          date_hash[:object_types].each do |inf|
            aux[inf[:class_name]] << inf[:count]
          end
        end
        
        aux.each { |k,v| series << {:name => k.to_s, :data => v} }
        

        那么这个系列数组就是你需要的。像 json 一样渲染它。

        【讨论】:

        猜你喜欢
        • 2011-04-01
        • 2012-10-29
        • 2019-10-27
        • 2019-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-09
        • 2010-12-11
        相关资源
        最近更新 更多