当前位置: 首页 > 知识库问答 >
问题:

递归JSON数据结构的遍历算法

西门梓
2023-03-14

我正在用Javascript构建一个图形编辑器,我需要一个算法来识别两个“节点”对象之间所有可能的路由。

给定以下JSON对象:

{
    "failureNode": {
        "failureNode": {
            "failureNode": {
                "failureNode": {
                    "failureNode": null,
                    "successNode": null,
                    "id": "node-endpointfailure",}
                },
                "successNode": {
                    "failureNode": null,
                    "successNode": null,
                    "id": "node-endpointsuccess",
                },
                "id": "node-1",
            },
            "successNode": {
                "failureNode": null,
                "successNode": null,
                "id": "node-endpointsuccess",
            },
            "id": "node-2",
        },
        "successNode": {
            "failureNode": {
                "failureNode": {
                    "failureNode": null,
                    "successNode": null,
                    "id": "node-endpointfailure",
                },
                "successNode": {
                    "failureNode": null,
                    "successNode": null,
                    "id": "node-endpointsuccess",
                },
                "id": "node-1",
            },
            "successNode": {
                "failureNode": null,
                "successNode": null,
                "id": "node-endpointsuccess",
            },
            "id": "node-3",
        },
        "id": "node-4",
    },
    "successNode": {
        "failureNode": null,
        "successNode": null,
        "id": "node-endpointsuccess",
    },
    "id": "node-root",
}

我需要ID为'node root'的节点之间的所有可能路由

  1. 开始-

对于这个例子,输出将是一个JSON路径数组。像这样的东西...

[
    failureNode.failureNode.failureNode.failureNode,
    failureNode.successNode.failureNode.failureNode
]

大多数应用程序都使用jQuery,所以纯Javascript或jQuery解决方案都可以工作。

共有2个答案

姜天宇
2023-03-14

我觉得你选择的表达方式有点奇怪和混乱。树不是表示这一点的最佳方式。您所描述的本质上是一个DAG(有向无环图)。递归表示最终会复制对象。虽然我确信还有其他方法来表示这一点,但一个简单的表示方法就是列出每个节点,其中包含由id标识的成功和失败节点。停止节点的成功和失败节点将具有空值(或零长度字符串,以两者中的任何一个为准)。或者你可以有一本关于所有这些的字典。

例如,您的图形可以(按列表)描述为:

[
  {
    id: "Start",
    successNode: "success",
    failureNode: "node-1"
  },
  {
    id: "node-1",
    successNode: "node-3",
    failureNode: "node-2"
  },
  {
    id: "node-2",
    successNode: "success",
    failureNode: "node-4"
  },
  {
    id: "node-3",
    successNode: "success",
    failureNode: "node-4"
  },
  {
    id: "node-4",
    successNode: "success",
    failureNode: "failure"
  },
  {
    id: "success",
    successNode: "",
    failureNode: ""
  },
  {
    id: "failure",
    successNode: "",
    failureNode: ""
  }
]

使编辑图表变得非常容易。只需添加或删除节点及其值。我可能会使用另一个对象作为字典,以便更快/更容易地找到每个节点。假设我确实有这样一个字典dicing,从一个节点导航到另一个节点查看您最终的位置并不难。

武友樵
2023-03-14

这将完成以下任务:

function recurse(from, to, node) {
    var result = [],
        choices = ["sucessNode", "failureNode"];
    if (!from && to == node.id)
        return [[]];
    if (from == node.id)
        return recurse(null, to, node);
    for (var i=0; i<choices.length; i++) {
        var choice = choices[i];
        if (node[choice] != null) {
            var res = recurse(from, to, node[choice]);
            for (var j=0; j<res.length; j++) {
                res[j].unshift(choice);
                result.push(res[j]);
            }
        }
    }
    return result;
}
recurse('node-root', 'node-endpointfailure', data);
 类似资料:
  • 问题内容: 是否有人对未知结构的NSDictionary进行了递归有序遍历?我想学习任何NSDictionary,并按层次结构顺序处理每个级别。 1)此数据来自经过验证的JSON。可以肯定地说,从诸如SBJSON(JSON框架)之类的框架创建的NSDictionary仅会导致嵌套字典,数组和任意叶的组合吗? 2)如何使用适用于数组和字典的快速枚举完成泛型遍历?使用下面的代码,一旦我到达数组中的字典

  • 从前有座山 山里有座庙 庙里有个老和尚和小和尚 老和尚对小和尚说: 从前有座山 返回1 从前有座山,山里有个庙,庙里有个和尚讲故事……这是一个古老的童谣,每个人都知道下面一句说了什么,但还要不厌其烦的说下去。犹如我们的人性,陷入一种循环,不可逃脱,无法自拔。 所以在我们现实生活中,很多时候也有所谓的重复性,而这种重复性用计算机解决的话,就能够省很多事情。 如果用一部电影来类比的话,那《盗梦空间》就

  • 问题内容: 我具有以下JSON结构: 如何使用JavaScript进行迭代? 问题答案: 取自jQuery docs:

  • 本文向大家介绍Java递归遍历树形结构的实现代码,包括了Java递归遍历树形结构的实现代码的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,直接给大家贴代码,具体代码如下所示: ps:java实现树的递归遍历(用于实现折叠菜单) 1.核心算法 2.实体类(部门) 以上所述是小编给大家介绍的Java递归遍历树形结构的相关内容,希望对大家有所帮助! 更多精彩内容请关注公众号【Java技术迷】,可

  • 问题内容: 我有一个简单的问题…我正在尝试使用切片在Golang中重现此递归数据结构。 现在,我在下面使用带有切片的递归数据结构的“粗糙”源代码,除了我输入的结构是结构而不是结构片之外,其他所有东西都可以正常工作。理想情况下,我希望类型化的递归数据结构是Trie的一部分,其中包含元素Trie {byte,[] Trie}。希望这有意义吗?现在,我有一个Trie struct {byte,[] Tr

  • 所以我在研究树遍历算法。例如,在K-d树遍历中,我们的目标是遍历节点直至叶子。这与其说是一个树搜索,不如说是一个根到叶的遍历。 在这种情况下,递归解决方案就足够了。但是,在C等语言中,递归调用函数需要将值推送到堆栈上,并在堆栈帧之间跳跃等。标准的递归方法类似于: 因此,考虑到二叉树有一个明确的上界(我相信这也可以扩展到其他树类型),以迭代方式执行此遍历是否更有效: 二叉树的最大高度是它的节点数,而