当我在d3.js中处理树状结构数据时,我经常需要在数据上调用forEach
或filter
模拟。
例如,这是数据:
data = {
id: 0,
children: [ {
id: 1,
children: [ ... ]
}, {
id: 2,
children: [ ... ]
}]
}
要检查数据中是否存在id = 5的节点,我必须通过所有子节点实现递归搜索功能。像这样:
function hasNodeWithId(node, id) {
if (node.id === id) {
return true;
} else {
return _.any(node.children || [],
function(n) { return hasNodeWithId(n, id); });
}
}
搜索树内的节点是一项常见的任务,所以我想知道d3.js库中是否存在某种辅助函数。如果没有,那么其他人如何处理这类问题呢?
P.S。
有时我可以使用tree.nodes
函数来获得平面数组:
var theId = 5,
tree = d3.layout.tree(),
nodes = tree.nodes(data), // makes a flat array of all the nodes in the data
theNode = nodes.filter(function(d) { return d.id === theId; });
但每次我需要遍历数据时调用tree.nodes(data)
都是压倒性的,并且在{{1}上有一些副作用(x
,y
,depth
字段) }}