2014-01-09 78 views
2

我想使用嵌套的json數組來繪製一個多系列的圖表與d3.js。我在這個網站和其他網站上看過很多地方,雖然有類似的話題,但我似乎無法使語法適用於我的特定問題(這是一個簡單的問題)。嵌套的JSON數組和D3JS

爲了使線圖(如一個在這裏:http://bl.ocks.org/mbostock/3883245),我可以分析這個JSON文件:

[{"date":"1-May-12","close":58.13},{"date":"30-Apr-12","close":53.98},{"date":"27-Apr-12","close":67}] 

通過使用該JavaScript語法:

d3.json("data/data2.json", function(error, data) {    
data.forEach(function(d) {        
    d.date = parseDate(d.date);       
    d.close = +d.close;         
}); 

但是,如果JSON是一個嵌套數組?例如:

{ 
"Stock01":[{"date":"1-May-12","close":58.13},{"date":"30-Apr-12","close":53.98},{"date":"27-Apr-12","close":67}] 
"Stock02":[{"date":"1-May-12","close":28.13},{"date":"30-Apr-12","close":33.98},{"date":"27-Apr-12","close":47}] 
} 

我試着像下面的腳本選項,但我沒有任何運氣:

d3.json("data/data2.json", function(error, data) {    
data.forEach(function(d) {        
    d.date = parseDate(d[0].date);       
    d.close = +d[0].close;         
}); 

如果任何人有如何導航嵌套的JSON陣列與建議data.forEach函數,我會很感激。預先感謝您的幫助。

+1

爲了進一步闡明:在['.forEach()'函數(https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Reference/Global_Objects/Array/forEach)僅適用於數組,爲數組中的每個元素調用一次內部函數。您需要訪問數據對象中的單個數組,然後使用'.forEach()'來掃描它們。 – AmeliaBR

回答

2

您想循環訪問數據中的鍵,使用鍵查找數據中的對應值,並對這些值進行操作。

你想是這樣的:

d3.json("data/data2.json", function(error, data) { 
    for (k in data) { 
     var k_data = data[k]; 
     k_data.forEach(function(d) {        
      d.date = parseDate(d[0].date);       
      d.close = +d[0].close;        
     }); 
    } 
}); 

此外,它看起來像forEach需要有兩個參數,keyvalue功能:

forEach: function(f) { 
    for (var key in this) { 
    if (key.charCodeAt(0) === d3_map_prefixCode) { 
     f.call(this, key.substring(1), this[key]); 
    } 
    } 
} 

例如:

values: function() { 
    var values = []; 
    this.forEach(function(key, value) { 
    values.push(value); 
    }); 
    return values; 
} 

稍後:AmeliaBR對於forEach是正確的:它不適用於對象/字典。

var a = {"stock1": [1, 2, 3, 4], "stock2": [2, 3, 5, 7], "stock3": [1,2, 4,8]}; 
a.forEach(function(value, key){ console.log(value, key);}); 
/* TypeError: Object #<Object> has no method 'forEach' */ 

但這作品:

a["stock1"].forEach(function(value, key){ console.log(value, key);}); 
1 0 
2 1 
3 2 
4 3 
+1

第一個版本是正確的想法,但您複製了@ ekatz混淆企圖的錯誤。以下是更正後的函數:http://fiddle.jshell.net/4QCsX/。另一種選擇是使用[d3的'entries(object)'](https://github.com/mbostock/d3/wiki/Arrays#wiki-d3_entries)方法將數據對象轉換爲數組,這將不得不無論如何,爲了將不同的股票分配到圖表中的不同行,如下所示:http://fiddle.jshell.net/4QCsX/1/ – AmeliaBR

+0

這真的很有幫助,我正在獲取數據以正確解析在每個陣列中。但是,當我嘗試運行圖表時,我現在得到一個錯誤,其內容如下:錯誤:解析d =「MNaN,NaNLNaN,NaN」的問題。任何想法,爲什麼這可能是? – ekatz

+0

感謝您的幫助。從這disccusion jsfiddle也有幫助:http://stackoverflow.com/questions/20016549/d3-multi-series-line-chart-from-pivoted-json – ekatz