2014-04-15 46 views
0

我試圖將一對數據結構中包含的數據轉換爲與HighCharts(一個JS圖表庫)兼容的格式。通過解析JSON文件來填充初始數據結構。 (I不能改變該步驟,而必須與所得到的數據結構的工作)的初始數據結構是這樣的:紅寶石 - 更改信息數據結構 - 陣列/哈希

初始化:

@areaBreakdown = Hash.new { |hash, key| hash[key] = Hash.new } 
@deptBreakdown = Hash.new { |hash, key| hash[key] = Hash.new } 

示例數據@areaBreakdown:

{#<Area id: 1, area_code: "123", created_at: "2014-04-04 20:23:11", 
updated_at: "2014-04-04 20:23:11", name: "testarea1", 
org_code: "123456">=>{"areaScore"=>46.65}, 
#<Area id: 2, area_code: "456", created_at: "2014-04-04 20:23:11", 
updated_at: "2014-04-04 20:23:11", name: "testarea2", 
org_code: "123456">=>{"areaScore"=>52.98}} 

樣品數據@deptBreakdown:

{#<Dept id: 1, dept_code: "78910", created_at: "2014-04-04 20:23:11", 
updated_at: "2014-04-04 20:23:11", name: "testdeptunderarea1", 
area_id: 1>=>{"deptScore"=>46.65}, 
#<Dept id: 2, dept_code: "4567", created_at: "2014-04-04 20:23:11", 
updated_at: "2014-04-04 20:23:11", name: "testdept1underarea2", 
area_id: 2>=>{"deptScore"=>49.81}, 
#<Dept id: 3, dept_code: "99999", created_at: "2014-04-04 20:23:11", 
updated_at: "2014-04-04 20:23:11", name: "testdept2underarea2", 
area_id: 2>=>{"deptScore"=>56.15}} 

Highchart對於我正在嘗試構建的圖表採用兩個單獨的數據結構。 areaBreakdown必須轉換爲散列數組,每個索引對應不同的區域。陣列名稱爲areaScores。 areaScores的

硬編碼版本:

@hardCodedAreaScores = Array.new 
# Push a Hash onto the array 
@hardCodedAreaScores.push Hash.new 
# Access the newly pushed hash by giving it a key, value pair to add 
@hardCodedAreaScores[0]["name"] = "area1" 
# Do it again 
@hardCodedAreaScores[0]["drilldown"] = "area1" 
# And again 
@hardCodedAreaScores[0]["y"] = 35.15 

@hardCodedAreaScores.push Hash.new 
@hardCodedAreaScores[1]["name"] = "area2" 
@hardCodedAreaScores[1]["drilldown"] = "area2" 
@hardCodedAreaScores[1]["y"] = 45.59 

@deptBreakdowndeptScores的轉化應該是散列的陣列。每個散列應該有3個鍵:「名稱」,「ID」和「數據」。 「name」=「id」=「深入」。數據是一個數組數組,它​​保存要顯示的圖表的數據點。例如,「data」= [[x1,y1],[x2,y2]]。

deptScores的硬編碼的實施例:

@hardCodedDepartmentScores = Array.new 
@hardCodedDepartmentScores.push Hash.new 
@hardCodedDepartmentScores[0]["name"] = "area1" 
@hardCodedDepartmentScores[0]["id"] = "area1" 
@hardCodedDepartmentScores[0]["data"] = Array.new 
@hardCodedDepartmentScores[0]["data"][0] = Array.new 
@hardCodedDepartmentScores[0]["data"][0].push "Department1UnderArea1" 
@hardCodedDepartmentScores[0]["data"][0].push 20.15 
@hardCodedDepartmentScores[0]["data"].push Array.new 
@hardCodedDepartmentScores[0]["data"][1].push "Department2UnderArea1" 
@hardCodedDepartmentScores[0]["data"][1].push 69.69 
@hardCodedDepartmentScores.push Hash.new 
@hardCodedDepartmentScores[1]["name"] = "area2" 
@hardCodedDepartmentScores[1]["id"] = "area2" 
@hardCodedDepartmentScores[1]["data"] = Array.new 
@hardCodedDepartmentScores[1]["data"][0] = Array.new 
@hardCodedDepartmentScores[1]["data"][0].push "Department1UnderArea2" 
@hardCodedDepartmentScores[1]["data"][0].push 98.21 
@hardCodedDepartmentScores[1]["data"].push Array.new 
@hardCodedDepartmentScores[1]["data"][1].push "Department2UnderArea2" 
@hardCodedDepartmentScores[1]["data"][1].push 12.34 

我嘗試:

def cycleThroughProcessedDataAndCreateHighChartsDataSetsBreakdown(areaBreakdown, deptBreakdown, employBreakdown) 
areaScores = Array.new 
areaScores.push Hash.new 
deptScores = Array.new 
deptScores.push Hash.new 
counter = 0 
deptCounter = 0 
areaCounter = 0 

    areaBreakdown.each_key do |area| 
    areaScores.push Hash.new 
    areaScores[counter]["name"] = areaBreakdown[area]["name"] 
    areaScores[counter]["drilldown"] = areaBreakdown[area]["name"] 
    areaScores[counter]["areaScore"] = areaBreakdown[area]["areaScore"] 

    deptScores.push Hash.new 
    deptScores[areaCounter]["name"] = areaBreakdown[area]["name"] 
    deptScores[areaCounter]["id"] = areaBreakdown[area]["name"] 


    deptBreakdown.each_key do |dept| 
    if deptScores[counter]["area_id"] == areaBreakdown[area]["area_id"] 
     deptScores[counter]["data"] = Array.new 
     deptScores[counter]["data"][deptCounter] = Array.new 
     deptScores[counter]["data"][deptCounter].push deptBreakdown[dept]["name"] 
     deptScores[counter]["data"][deptCounter].push deptBreakdown[dept]["deptScore"] 

     deptCounter += 1 
    end  
    #areaCounter += 1 
    end 
counter += 1 
end 
debugger 

return deptScores, areaScores 
end 

我的問題是如何正確地兩個初始數據結構(或兩個硬編碼版本)轉換爲所需的數據結構。我對ruby有點新,而且我無法訪問某些信息,比如name和id。在嘗試迭代並填寫各種數據結構時,我也遇到了大量空方法錯誤。迭代必須發生,因爲@areaBreakdown@deptBreakdown的大小是動態的。如何正確填寫兩個數據結構@areaScores@deptScores

謝謝, 馬特

附:我爲這篇長文發表道歉。任何幫助表示讚賞。如果問題不明確,將提供更多細節。

電流輸出:

(rdb:1) areaScores 
[{"name"=>nil, "drilldown"=>nil, "areaScore"=>46.65}, {"name"=>nil, "drilldown"=>nil, "areaScore"=>52.98}] 

(rdb:1) deptScores 
[{"name"=>nil, "id"=>nil, "data"=>[nil, nil, [nil, 56.15]]}, {"data"=>[nil, nil, nil, nil, nil, [nil, 56.15]]}, {}] 
+0

你確定'@ areaBreakdown'和'@ deptBreakdown'是散列嗎?它們看起來更像是基於該可視化的對象數組。另外,你可以發佈你收到的錯誤/錯誤嗎? – Doydle

+0

@Doydle這是他們如何被初始化是不是他們(哈希)?目前沒有任何錯誤,但輸出不完整且不正確。我已經更新了我的嘗試,並且包含了areaScores和deptscores的當前輸出。輸出包含在問題的底部。我仍然不確定爲什麼「名稱」在areaScores中以「零」出現。 deptscores的數據結構也是關閉的,與areaScores類似,「name」和「id」等字段沒有被填充。是否有更多信息可以提供給您? –

回答

1

我終於能夠找出我的問題。設置名稱和ID時,我沒有正確訪問哈希。我已經包含下面我的解決辦法:

解決方案:

areaScores = Array.new 
deptScores = Array.new 
counter = 0 

areaBreakdown.each_key do |area| 
    deptCounter = 0 
    areaScores.push Hash.new 
    areaScores[counter]["name"] = area["name"] 
    areaScores[counter]["drilldown"] = area["name"] 
    areaScores[counter]["y"] = areaBreakdown[area]["areaScore"] 

    deptScores.push Hash.new 
    deptScores[counter]["name"] = area["name"] 
    deptScores[counter]["id"] = area["name"] 
    deptScores[counter]["data"] = Array.new 

    deptBreakdown.each_key do |dept| 
    if dept["area_id"] == area["id"] #if department belongs to area 
     deptScores[counter]["data"][deptCounter] = Array.new 
     deptScores[counter]["data"][deptCounter].push dept["name"] 
     deptScores[counter]["data"][deptCounter].push deptBreakdown[dept]["deptScore"] 
     deptCounter += 1 
    end #if  
    end #deptBreakdown 
    counter += 1 
end #areaBreakdown 
#debugger 
return deptScores, areaScores 

感謝您的幫助!