在d3.js嵌套数据联接中,如何访问早期联接中的数据?
我已经创建了一个d3.js页面,其中显示了一组带有x,y坐标的图形节点,但是我在每个外部节点中使用了d3的包布局 我有生成此页面的功能代码,它如下所示:在d3.js嵌套数据联接中,如何访问早期联接中的数据?,d3.js,nested,D3.js,Nested,我已经创建了一个d3.js页面,其中显示了一组带有x,y坐标的图形节点,但是我在每个外部节点中使用了d3的包布局 我有生成此页面的功能代码,它如下所示: d3.json("knowledge.json", function(error, graphNodes) { if (error) return console.error(error); graphNodes.forEach( function (graphNode) { var innerNodes = pack.no
d3.json("knowledge.json", function(error, graphNodes) {
if (error) return console.error(error);
graphNodes.forEach( function (graphNode) {
var innerNodes = pack.nodes(graphNode);
svg.selectAll(".node")
.data(innerNodes, function(d) {return d.id})
.enter().append("circle")
.style("fill", function(d) {return color(d.depth);})
.attr("class", "node")
.attr("cx", function(d) {return (d.x + graphNode.xOffset);})
.attr("cy", function(d) {return (d.y + graphNode.yOffset);})
.attr("r", function(d) {return d.r;});
});
});
这是可行的,但令人不满意,因为我使用的是JavaScript的.forEach,而不是带有嵌套联接的数据驱动方法。下面是一个嵌套联接示例:
d3.json("knowledge.json", function(error, data) {
if (error) return console.error(error);
var groups = svg.selectAll(".node")
.data(data)
.enter().selectAll("circle")
.data(function (d) { return pack.nodes(d); })
.enter().append("circle")
.style("fill", function(e) { return color(e.depth); })
.attr("class", "node")
.attr("cx", function(e) {return e.x;})
.attr("cy", function(e) {return e.y;})
.attr("r", function(e) {return e.r;});
});
请注意,我在这里使用了两次.data,首先在外部图形上,然后在从图形的每个节点生成的包上。但是,这并不考虑外部节点的xOffset和yOffset。如何从第二个联接内部获取第一个联接的数据?虽然scope使以下内容变得不可能,但我希望在最后三行中使用类似的语法:
.attr("cx", function(e) {return d.xOffset + e.x;})
.attr("cy", function(e) {return d.yOffset + e.y;})
.attr("r", function(e) {return e.r;});
感谢您能分享的任何见解 使用秘密的第三个参数:Lars所说的,另外,如果DOM节点嵌套并以与数据层次结构相对应的方式绑定到数据,那么您可以使用例如.attrcx,functione{var d=d3.selectthis.parentNode.datum;返回d.xOffset+e.x;}。同样,这假设父DOM节点绑定到您要查找的数据。谢谢,Lars和meetamit。这些都是非常有用的技巧!拉尔斯,如果我有足够的声誉,我会投票支持你的链接答案。很抱歉