2011-04-10 5 views
0

내 웹 응용 프로그램에서 Highcharts를 사용하려고하지만 highcharts에 필요한 출력과 일치하도록 배열을 가져 오는 데 문제가 있습니다. 본질적으로 hightchart에는 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 (내 경우) 처음에 의해 그룹화 된 항목이 필요 보인다 다음 내 그 data의 각 항목과 같은 일에 의해 :count.

우아하게 이것을 수행하는 "루비 방법"을 찾는 데 어려움을 겪고 있습니다. 어레이와 해시를 조작하는 데 아주 훌륭합니다. 아마 이것을 볼 수있을 지 모르겠지만, 이것을 달성하는 데 도움이 될 것입니다. 옳은 길은 인정 받고 있습니다.


둘째, 원래는 내 질문에 group()를 사용하여이 작업을 수행하려하지만 나던 많이 생각을 돕는 것 같다? 내가 해결해야 할 또 다른 일은 거기에 레코드가 없다면 날짜를 "0"으로 채우는 것입니다.하지만 그 다음에 생각할 것입니다. 이 같은

답변

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가 액티브 또는 루비 1.8.7+입니다. flat_map은 Ruby 1.9.2의 새로운 기능입니다. 올바른 버전 또는 require "backports"을 사용하십시오.

1

뭔가 작업을해야합니다 :

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 라이브러리에 대한 기대 형식에 맞는 객체를 가지고있다.

1
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처럼 렌더링하십시오.

+0

아마도'Hash.new {| h, k | hash.new (Array.new)가 아닌 [h [k] = []}'입니다. –

+0

같은 동작이 아닙니까? – pedrofs

+0

Nope. 'Hash.new ([])','Hash.new {[]}'와'Hash.new {| h, k | h [k] = []}'은 다릅니다. http://stackoverflow.com/questions/2692141/hash-default-value-not-being-used & http://stackoverflow.com/questions/2552579/ruby-method-array-not-updating-the-array를 참조하십시오. 해쉬 인 –