1 つの方法は、2 つの配列から新しい 2D 配列を作成して、標準のネストされた選択パターンに適したものにすることです ( http://bost.ocks.org/mike/nest/を参照)。
var arr1 = ['a', 'b', 'c'],
arr2 = ['d', 'e', 'f'];
// prepare a 2D array
var data = arr1.map(function(v1) {
return arr2.map(function(v2) {
return v1 + v2;
})
});
d3.select("body").append("table")
.selectAll("tr")
.data(data)
.enter().append("tr")
.selectAll("td")
.data(Object)
.enter().append("td")
.text(String);
別のアプローチは、関数がグループ内の要素のインデックス i だけでなく、それが属するグループのインデックス j も渡されるという事実を利用することです。
var arr1 = ['a', 'b', 'c'],
arr2 = ['d', 'e', 'f'];
d3.select("body").append("table")
.selectAll("tr")
// arr1 corresponds to the rows
// bound data is not used in the td cells; only arr1.length is used
.data(arr1)
.enter().append("tr")
.selectAll("td")
// arr2 corresponds to the columns
.data(arr2)
.enter().append("td")
.text(function(d, i, j) { return arr1[j] + d; }); // d === arr2[i]
同様のアプローチでは、インデックス j の代わりに parentNode を使用して、グループからバインドされたデータを取得します。
var arr1 = ['a', 'b', 'c'],
arr2 = ['d', 'e', 'f'];
d3.select("body").append("table")
.selectAll("tr")
// arr1 corresponds to the rows
.data(arr1)
.enter().append("tr")
.selectAll("td")
// arr2 corresponds to the columns
.data(arr2)
.enter().append("td")
.text(function(d) { return d3.select(this.parentNode).datum() + d; });