sei angenommen, dass I-Daten wie diese haben:Erzeugen mehrerer DOM Elemente aus einem einzelnen Datenpunkt mit D3.js
[{from: 3, to: 5}, {from: 1, to: 2}]
Ich möchte das folgende SVG generieren:
<svg width="100" height="100">
<g transform="translate(0,0)">
<rect x="0" width="5" height="5"></rect>
<rect x="10" width="5" height="5"></rect>
<rect x="20" width="5" height="5"></rect>
</g>
<g transform="translate(0,30)">
<rect x="0" width="5" height="5"></rect>
<rect x="10" width="5" height="5"></rect>
</g>
</svg>
Grundsätzlich Für jeden Datenpunkt muss ich to - from + 1
Rechtecke generieren. So habe ich angefangen:
var width = 100;
var x = d3.scale.ordinal()
.domain(d3.range(10))
.rangeRoundBands([0, width]);
var svg = d3.select('svg').append('svg')
.attr('width', width)
.attr('height', 100);
var row = svg.selectAll('g')
.data(data)
.enter().append('g')
.attr('transform', function(d, i) { return 'translate(0,' + i * 30 + ')';});
Nun, wie erzeuge ich mehrere Rectures für jeden Datenpunkt mit der Kettensyntax?
Ich weiß, dass ich es so tun könnte:
var rects = row.selectAll('rect')
.data(function(d) { return d3.range(d.to - d.from + 1);})
aber ich möchte die Schaffung nutzlos Arrays zu vermeiden.
Ihre Reichweite Idee ist wahrscheinlich der beste Weg zu gehen, da d3 grundsätzlich dom Elemente erzeugt eine Eins-zu -ein gegen Daten. Ich würde über irgendwelche Effizienz-/Müllsammlungsprobleme mit einem Array einiger Integer nicht sorgen. – mgraham