Javascript 查找层次结构中最长链的长度
我的应用程序中有用于创建svg的分层数据。我需要找到数据源中最长链的长度。我可以逐级遍历数据源,递归地深入到数据源中以读取子级,调用递归函数来计算级别,但我相信一定有更好的方法。这是进一步复杂化的,因为数据源可以从它以_子节点和_父节点开始的节点向两个方向移动Javascript 查找层次结构中最长链的长度,javascript,d3.js,hierarchy,Javascript,D3.js,Hierarchy,我的应用程序中有用于创建svg的分层数据。我需要找到数据源中最长链的长度。我可以逐级遍历数据源,递归地深入到数据源中以读取子级,调用递归函数来计算级别,但我相信一定有更好的方法。这是进一步复杂化的,因为数据源可以从它以_子节点和_父节点开始的节点向两个方向移动 var findChildren = function (ds, level) { if (!ds._children || ds._children.length == 0) { return level;
var findChildren = function (ds, level) {
if (!ds._children || ds._children.length == 0) {
return level;
}
var longest = level + 1;
ds._children.forEach(function (item) {
var result = findChildren(item, level + 1);
if (result > longest) {
longest = result;
}
});
return longest;
}
这是我目前正在使用的函数,有一个相同的函数,它检查ds.\u parents
以转到另一个方向,将一个的结果作为另一个的起始级别传递。我只是确信一定有更好的方法
例如,相同的数据可以有三种方式,具体取决于用户从何处打开树
{“编号”:1,“类型”:“交货”,“家长”:[{“编号”:1,“类型”:“订单”,“家长”:[{“编号”:1,“类型”:“报价”}]}
{“数字”:1,“类型”:“顺序”,“家长”:[{“数字”:1,“类型”:“引号”}],
“_children”:[{“number”:1,“type”:“Delivery”}]}
{“数字”:1,“类型”:“引号”,“子项”:[{“数字”:1,“类型”:“订单”,“子项”:[{“数字”:1,“类型”:“交货”}]}
d3.hierarchy()
var hierarchy = d3.hierarchy(data);
。。。它会在每个节点中自动创建一个名为depth
的属性:
node.depth-根节点为零,每个子代增加一
因此,我们只需要一个简单的函数来获得最大的深度值。例如:
var longest = d3.max(hierarchy.descendants().map(function(d) {
return d.depth
}));
下面是一个演示:
var数据={
“姓名”:“夏娃”,
“儿童”:[{
“姓名”:“该隐”
}, {
“姓名”:“赛斯”,
“儿童”:[{
“名称”:“Enos”
}, {
“名称”:“诺姆”
}]
}, {
“姓名”:“亚伯”
}, {
“姓名”:“阿万”,
“儿童”:[{
“名称”:“以诺”
}]
}, {
“姓名”:“阿祖拉”
}]
};
风险等级=d3.等级(数据);
var longest=d3.max(hierarchy.subjects().map)(函数(d){
返回深度
}));
log(“最长的链有“+(最长的+1)+”级别。”)
你能分享“分层数据”吗?“但我相信一定有更好的方法。”你为什么这么肯定?最深的
是最长的
的打字错误吗?如果不是,它来自哪里?@ScottSauyet是的,在我意识到我需要走两条路之前,我把它写成了最深的,最深的层次,所以把它改成了在两个方向都更有意义的东西,最长。我重新打开了这个问题,因为这不是一个完全重复的问题:这个问题有标签,D3有具体的方法。这看起来肯定能解决我一半的问题,问题是数据源有两种方式,我可能从我的数据源的“根”有\u个孩子和/或\u个父母,有什么方法可以同时处理这两个问题吗?根目录没有父目录。如果你的根有父母,它就不是根!从技术上讲,数据是从选定的基础对象向任意方向移动的两棵树…@Andrew在这种情况下,您必须共享数据。不要编辑这个问题,我建议你发布一个新问题,包含数据(两棵树)和问题的清晰描述。如果数据太大,创建两个简单的树作为示例。我用一个简短的数据示例补充了这个问题,在三种不同的可能配置中,哪种配置取决于用户从何处开始(如果从“顺序”打开,他们会得到选项2)
var longest = d3.max(hierarchy.descendants().map(function(d) {
return d.depth
}));