说我有以下JSON数组:
var json = [
[1,2,3],
[1,2,3],
[1,2,3]
];
如何在不执行2 rect
次呼叫的情况下呈现SVG selectAll
节点的网格?在这个fiddle中,我能够创建网格,但是我必须在中间g
节点内渲染每一行。有没有办法在没有第一次选择的情况下编写它?如果我尝试:
svg.data(json)
.selectAll('rect')
.data(function(data) { return data; })
.enter()
.append('rect')
.attr('x', function(data, x, y) {
return (x * size) + (x * spacing);
})
.attr('y', function(data, x, y) {
return (y * size) + (y * spacing);
})
.attr('width', size)
.attr('height', size);
它只渲染2D数组的第一行。
答案 0 :(得分:1)
你的意思是你不想在层次结构中拥有g
个节点,而是想要制作所有rects
直接兄弟节点吗?
这是可行的,但您必须首先将json展平为具有9个元素的1维数组(此处未显示;可以使用Array.reduce()
)。然后你只会选择并绑定一次:
var flatJson = [1,2,3,1,2,3,1,2,3]
svg
.selectAll('rect')
.data(flatJson)`
和基于i
的位置:
.enter()
.append('rect')
.attr('x', function(d, i) {
return (i % numColumns) * (size + spacing);
})
.attr('y', function(d, i) {
return Math.floor(i/numColumns) * (size + spacing);
})
.attr('width', size)
.attr('height', size);
权衡是需要了解列数numColumns = 3
。
扁平的json可以变成一个对象数组,每个对象可以有一个列和一行。例如:
var flatJson = [
{ row:0, col:0, value: 1},
{ row:0, col:1, value: 2},
{ row:0, col:2, value: 3},
{ row:1, col:0, value: 1},
...
]