SVG D3.js - 巢狀數據結構 ( d3.nest )

之前在「SVG D3.js - 淺談 D3.js 的資料處理」提過基本的數據處理方法,這陣子又研究了一下 d3.js 的 nest,這篇就來介紹一下這個很有意思的數據處理方法:d3.nest。

參考:SVG D3.js - 淺談 D3.js 的資料處理

什麼是 nest

nest 就是「巢」的意思 ( 不是潮喔~ 雖然 d3.js 好像有點潮 ),透過 d3.nest 的轉換,可以將原本的數據變成以 key 和 value 為主的巢狀結構,並且可以針對巢狀結構的每個節點進行排序,而所得到的巢狀結構數據,可以在程式裡重複使用而不會影響到原本的數據。

光是看文字其實是搞不清楚的,直接用個簡單的範例來說明一下,下面是一個 json 的檔案格式,是四個班級學生的得分,分別有 name、score 和 type。

var data = [
  {name:'Tom'   , score:98, type:'class1' , sex:'man'},
  {name:'Jack'  , score:72, type:'class2' , sex:'man'},
  {name:'Owen'  , score:93, type:'class3' , sex:'man'},
  {name:'Mark'  , score:41, type:'class4' , sex:'man'},
  {name:'Marry' , score:67, type:'class4' , sex:'woman'},
  {name:'Rock'  , score:59, type:'class2' , sex:'man'},
  {name:'Jason' , score:83, type:'class1' , sex:'man'},
  {name:'Peter' , score:47, type:'class3' , sex:'man'},
  {name:'Cherry', score:53, type:'class1' , sex:'woman'},
  {name:'Jean'  , score:68, type:'class4' , sex:'woman'}
];

這時候利用 d3.nest,把 type 設為 key,這時候 value 就會以 type 為樹狀結構的節點往下長,這裡我們先使用了 d3.nest 的 key 和 entries 這兩個 API,key 主要讓我們作為節點使用,把要做為節點的值以 key 的方法長出來,最後用 entries 把 data 丟進去。( 範例:svg-d3-06-data-nest-demo1.html,打開開發者工具看 console 喔~ )

var a = d3.nest()
          .key(function(d){return d.type;})
          .entries(data); 

console.log(a);

SVG D3.js - 巢狀數據結構 ( d3.nest )

同樣的道理,如果再把 sex 設為第二層 key,就會再依據 sex 長出一層。( 範例:svg-d3-06-data-nest-demo2.html )

var a = d3.nest()
        .key(function(d){return d.type;})
        .key(function(d){return d.sex;})
            .entries(data); 

console.log(a);

SVG D3.js - 巢狀數據結構 ( d3.nest )

其他的 API

上面的例子這就是 d3.nest 最基本的用法,用這個方法,就可以很輕鬆的把一堆資料分類,篩選出所需要的東西,但 d3.nest 還有其他的 API,這裡先列出 d3.nest 具有的 API,然後再來一個個看看它們功用:

  • nest.sortKeys(comparator)
  • nest.sortValues(comparator)
  • nest.rollup(function)
  • nest.map(array[, mapType])

小結

以上就是 d3.nest 的用法介紹,基本上因為 d3.js 已經有相當豐富的圖表讓大家使用,因此如何利用巢狀結構,做出適合圖表的數據,就變成使用者要學習的了。

有興趣瞧瞧其他新文章嗎?