2次元配列を使って。
http://www.openspc2.org/reibun/D3.js/code/table/0004/index.html http://bl.ocks.org/biovisualize/1226718
成果物
Playgrounds
See the Pen d3.entries.201702200818 by ytyaru (@ytyaru) on CodePen.
開発環境
- Linux Mint 17.3 MATE
- Firefox 42.0
- d3.js v4.5.0
前回まで
d3.jsのデータ駆動、セレクタなどに触れてリストを作成した。
今回
2次元配列でテーブルを作成する。
要点
data()を2回使ってネストした2次元配列を展開する。
コード
datas = [[0, "山田"],[1, "鈴木"],[2, "高橋"]]; // データ定義する d3.select("#NameList").select("tbody") // 差し込み先要素を選択する .selectAll("tr") // データの行分だけ`tr`を追加する .data(datas) // ↓ .enter() // ↓ .append("tr") // ↓ .selectAll("td") // データの列分だけ`td`を追加する .data(function(row){return row;}) // ↓ .enter() // ↓ .append("td") // ↓ .text(function(col){return col;}); // ↓
data()を2回使っている。
- .data(datas)で2次元配列を展開し- [...],[...],[...]とする
- .data(function(row){return row;})で1で得た1つあたりの- [...]を展開し- [num, "name"]とする
翻訳
コードのインデントをみれば何となく構造がわかると思う。大きく分けるとtr(行)とtd(列)の2つになる。コードを1行ずつ日本語で理解してみる。
.selectAll("tr")
| 問い | 答え | 翻訳 | 
|---|---|---|
| どこに差し込むか | d3.select("#NameList").select("tbody") | id属性値がNameListの要素中にあるtbody要素に。 | 
| 対象DOM要素はどれか | .selectAll("tr") | 上記内の全 tr要素 | 
| 対象配列データは何か | .data(datas) | [[...],[...],[...]]配列(3つの要素) | 
| いつ行うか | .enter() | 差し込む要素よりデータのほうが多い時に、多い分のデータだけ。 | 
| 何を差し込むか | .append("tr") | tr要素を追加する | 
.selectAll("td")
| 問い | 答え | 翻訳 | 
|---|---|---|
| どこに差し込むか | 〜.append("tr") | 〜のように作成された tr要素に。 | 
| 対象DOM要素はどれか | .selectAll("td") | 上記内の全 td要素 | 
| 対象配列データは何か | .data(function(row){return row;}) | 子配列 [...]をそれぞれ0, "山田"のように展開した配列データ | 
| いつ行うか | .enter() | 差し込む要素よりデータのほうが多い時に、多い分のデータだけ。 | 
| 何を差し込むか | .append("td") | td要素を追加する | 
| 差し込む要素のどこをどうするか | .text(function(col){return col;}); | テキストノード値に 0,山田など展開された値を設定する | 
所感
コードはあっさりしているが、かなり苦労した。d3.jsのメソッドチェーンは難しい。練習あるのみか。