Javascript 查找层次结构中最长链的长度

Javascript 查找层次结构中最长链的长度,javascript,d3.js,hierarchy,Javascript,D3.js,Hierarchy,我的应用程序中有用于创建svg的分层数据。我需要找到数据源中最长链的长度。我可以逐级遍历数据源,递归地深入到数据源中以读取子级,调用递归函数来计算级别,但我相信一定有更好的方法。这是进一步复杂化的,因为数据源可以从它以_子节点和_父节点开始的节点向两个方向移动 var findChildren = function (ds, level) { if (!ds._children || ds._children.length == 0) { return level;

我的应用程序中有用于创建svg的分层数据。我需要找到数据源中最长链的长度。我可以逐级遍历数据源,递归地深入到数据源中以读取子级,调用递归函数来计算级别,但我相信一定有更好的方法。这是进一步复杂化的,因为数据源可以从它以_子节点和_父节点开始的节点向两个方向移动

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方法可以快速找到最深的叶子

    因此,假设我们有一个分层数据,如:

    当您将其传递给
    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
    }));