經過進一步調查,我發現可行的解決方案是讓json對象看起來像stacked grouped chart example中提供的數據格式。這可能不是達到目標的理想方式,但它應該完成工作。
我所做的是在最初的例子使用了一堆for .. in
循環來構建對象,如:
...cut-out version bellow...
itemLookup= data[0],
years = d3.keys(itemLookup.year),
items = d3.keys(itemLookup.year[years[0]]),
columnHeaders = [],
innerColumns = (function(){
var result = {};
for(var i = 0, ii = years.length; i<ii; i++){
var holder = [];
for(var j = 0, jj = items.length; j<jj; j++){
columnHeaders.push(items[j]+'-'+years[i]);
holder.push(items[j]+'-'+years[i]);
result[years[i]] = holder;
}
}
return result;
})()...
從這裏我能得到初始的例子開始的點,其中一個對象,作爲硬編碼傳入的數組,並用作構建數據的比較指南;倒在foreach loop
線某處:
data.forEach(function(d, i){
var tempData = {},
curYear;
tempData.monthName = d.month;
//functionality to be implemented
if(d.month === stripedPattern.monthName){
chart
.select('svg')
.append('defs');
}
for(var key in d.year){
if(curYear != key){
curYear = key;
tempData['totalValue-'+curYear] = 0;
}
var holder = d.year[key];
for(var item in holder){
tempData[item+'-'+key] = holder[item];
tempData['totalValue-'+curYear] += parseInt(holder[item]);
}
}
//this obj holds the correct data, similar to what the example provided
dataRebuild.splice(i, 0, tempData);
});
而且從這裏開始,這個想法停留在相同最初的例子,因爲我得到了我的數據格式看起來像從示例數據,並能夠執行它。
再次如果有(最有可能的話)一些其他更優雅的解決方案到達該端點,請在這裏分享它們。
時退房 '工作' demo here(進展)
在'd.total = d3.max(d.columnDetails,函數(d){ 回報d.yEnd; });'你正在變得'd.yEnd'未定義。 – ozil
@ozil是的,這個map函數有些錯誤;我沒有得到正確的數據,或者更好地不知道這個例子是否適用於我的數據格式 – RGLSV
我不會提供不運行的代碼.... – thatOneGuy