2014-03-03 24 views
0

我不確定這是否可行,但我嘗試創建一個d3.nest對象,其中的鍵是元素名稱而不是元素的名稱值。這是用於堆積區域圖表。D3 - 試圖根據元素名稱而不是值嵌套

這裏是樣本的原始數據:

{ 
     "_id" : { 
       "month" : 2, 
       "day" : 26, 
       "year" : 2014 
     }, 
     "total" : 34492, 
     "failed" : 1, 
     "skipped" : 0 
} 

我想創建基於總窩對象,失敗,跳過元素名稱,而不是它們的值(即:不是數字)。

得到的巢對象會是這樣的:

[ 
    { 
     key: "total", 
     values: [ 
      { 
       "date": "2014-02-26T05:00:00.000Z", 
       "count": 34492 
      }, 
      { 
       "date": "2014-02-27T05:00:00.000Z", 
       "count": 34495 
      } 
     ] 
    }, 
    { 
     key: "failed", 
     values: [ 
      { 
       "date": "2014-02-26T05:00:00.000Z", 
       "count": 1 
      }, 
      { 
       "date": "2014-02-27T05:00:00.000Z", 
       "count": 0 
      } 
     ] 
    } 
] 

我沒有對原始數據的佈局一些控制,所以我曾嘗試加入總,失敗,跳過狀態對象下的元素,但也沒有工作。

下面是一些代碼,我有工作:

data.result.forEach(function(d) { 
    d.date = new Date(d._id.year, d._id.month-1, d._id.day); 
    d.status = { 
     "total": d.total, 
     "failed": d.failed, 
     "skipped": d.skipped 
    }; 
}); 

var nested = d3.nest() 
    .key(function(d) { return d.status; }) 
    //.key(function(d) { return d.total; }) 
    //.key(function(d) { return d.failed; }) 
    //.key(function(d) { return d.skipped; }) 
    .entries(data.result); 

謝謝你的幫助。

回答

1

這不是d3.nest的工作,但它當然可以完成。

當您想要根據分組變量(或多個嵌套組)分割成多個子數組的長數組時,將使用嵌套函數。原始數組中的每個元素只出現在其中一個子數組中。

你想要的是重複三次相同的數據對象數組,每次提取一個不同的值。

開始與原來的步驟解析日期值:

data.result.forEach(function(d) { 
    d.date = new Date(d._id.year, d._id.month-1, d._id.day); 
}); 

然後創建一個你想有作爲獨立的數據系列中的不同狀態類型的數組。你可以通過查看對象鍵的數據創建這個數組,但我假設在這裏,你知道的選項應該是什麼:

var statusTypes = ["total", "failed", "skipped"]; 

然後使用嵌套array mapping functions

  1. 創建新陣列,它包含您的statusTypes陣列中每個值的單獨數據系列;和
  2. 對於每個數據系列,創建一個包含適當計數值的數據數組版本。

像這樣:

var dataSeries = statusTypes.map(function(type) { 

      //for each type, create a mapped version of the data array 
      return data.result.map(function(d) { 

         //for each entry in the data array, 
         //create a new data object based on the 
         //specific type of count 
         return { date: d.date, 
           count: d[type] 
          }; 
       }); 

    }); 
+0

謝謝你 - 偉大工程。 – JamesE

+0

您可以使用它來生成多個嵌套的結構是這樣的: VAR層= [ { 「名」:「總」, 「值」:[{ 「日期」:太陽2014年3月2日00:00 :00 GMT-0500(東部標準時間),「count」:91}, {「date」:2014年3月3日星期一00:00:00 GMT-0500(東部標準時間),「count」:290} ] } ]; 我在玩它,但我從來沒有用過地圖。 – JamesE

+1

'map'只是創建一個新的數組,其中每個元素是在原始數組的相應元素上運行函數的結果。如果你想讓每個元素成爲一個對象,而不僅僅是子數組,那麼只要確保從外部映射函數返回的是:'function(type){var o = {}; o.name = type; o.values =/*內部映射函數* /;返回o; }' – AmeliaBR