fizzbuzztable

D3.jsでサクッとFizzBuzzを可視化する

fizzbuzztable

example

D3.jsを使って、FizzBuzzの結果をテーブルで表示します。
DOMにデータを束縛するD3の機能を使うと非常に簡単に作成することができます。

サンプルコード

解説

ちょっとだけ解説

FizzBuzz配列を作る

d3.rangeは等差数列を含むリストを生成します。d3.range(1, 100)を実行すると以下の配列が生成されます。
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …… 99]
2番目の引数は要素数の指定なので、1〜100までの数列を作りたいときは+1します。
生成した配列にmapメソッドを用いてFizzBuzz関数を適用します。実行結果が以下のようになります。
[1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, …… "Buzz"]

配列を分割してデータセットを作る

作成したFizzBuzz配列を10個づつに分割して2次元配列のデータセットを作成します。
[
[1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz"],
[11, "Fizz", 13, 14, "FizzBuzz", 16, 17, "Fizz", 19, "Buzz"],
(中略)
[91, 92, "Fizz", 94, "Buzz", "Fizz", 97, 98, "Fizz", "Buzz"]
]

テーブルを作成する

body要素の中にtable要素を追加します。

データセットを元にtr要素を追加します。

この段階でブラウザの開発者ツールを使いDOMの状態を覗いてみると、以下のようにTR要素が追加されているのがわかります。

d3fizzbuzztable

戻り値を収めている変数trには、追加した要素のオブジェクトが入っています。

d3.select(‘tr’)で中身を覗いていると__data__プロパティにデータセットが束縛されているのがみてとれます。

d3fizzbuzztable2

tdを追加する

今回のポイント、td要素を追加します。

D3になれていないと混乱するのが以下の部分。
tr.selectAll('td')
.data(function(d){ return d })
.enter()
.append('td')

dataメソッドにコールバックを設定し、引数をreturnでそのまま返しています。
これが何をやっているのかというと、親要素(tr)に束縛されたデータセットがコールバックの引数として渡されるので、それをそのまま戻り値としてdataメソッドに渡すことでtd要素を各tr要素の配下に追加しています。
引数に何が渡されているかを見るために、returnの前にconsole.logを追加して中身を見てみるとわかりやすいです。
tr.selectAll('td').data(function(d){ console.log(d); return d })
> [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz"]
> [11, "Fizz", 13, 14, "FizzBuzz", 16, 17, "Fizz", 19, "Buzz"]
> ["Fizz", 22, 23, "Fizz", "Buzz", 26, "Fizz", 28, 29, "FizzBuzz"]
(中略)
> [91, 92, "Fizz", 94, "Buzz", "Fizz", 97, 98, "Fizz", "Buzz"]

この段階でDOMの状態を覗いてみるとtd要素が追加されているのが分かります。
d3fizzbuzztable4

残りの構文(attrとtext)では、tdに渡されたデータが文字列(“Fizz”や”Buzz”、”FizzBuzz”)だった場合、tdのcalss属性として設定し、テキスト要素を追加しています。
最終的な出力は以下のようになります。

d3fizzbuzztable

「dataメソッドのコールバックの引数に、要素に束縛されているデータセットが渡される」というD3の機能を使うと、メンドウな処理も結構簡単に作成することができます。

カテゴリー: D3v3