如果我有一堆流程图节点:
var nodes = [
{NodeType: "prep", x:50, y:50, height:40, width: 160},
{NodeType: "io", x:50, y:125, height:40, width: 160},
{NodeType: "io", x:50, y:200, height:40, width: 160}
]
我想将它们全部表示为矩形,在一个附加中很容易做到这一点:
svg.selectAll("rect")
.data(nodes)
.enter().append("rect")
.attr("x", function(d) { return d.x; })
.attr("width", function(d) { return d.width; })
.attr("y", function(d) { return d.y; })
.attr("height", function(d) { return d.height; })
.attr("stroke", "black")
.attr("fill", "none");
但是,如果我希望它们根据它们的类型(上面的示例中的 IO 和准备)成为不同的形状怎么办?
我用路径函数字典而不是矩形(完整代码在http://bl.ocks.org/4659227)破解了一种方法。每个路径函数都接受高度和宽度。
svg.selectAll("path")
.data(nodes).enter().append("svg:path")
.attr("d", function(d) { return flow_shapes[d.NodeType](d.height, d.width);})
.attr("stroke", "black")
.attr("fill", "none")
.attr("transform", function(d) {
return "translate(" + d.x + "," + d.y + ")"
});
但似乎必须有更好的标准方法来做到这一点。有任何想法吗?
我还担心上述代码在大型节点列表上的性能,尽管我还没有对其进行任何压力测试。