Javascript 递归JSON数据结构的遍历算法
我正在用Javascript构建一个图形编辑器,我需要一个算法来识别两个“节点”对象之间所有可能的路由 给定以下JSON对象:Javascript 递归JSON数据结构的遍历算法,javascript,tree,traversal,Javascript,Tree,Traversal,我正在用Javascript构建一个图形编辑器,我需要一个算法来识别两个“节点”对象之间所有可能的路由 给定以下JSON对象: { "failureNode": { "failureNode": { "failureNode": { "failureNode": { "failureNode": null, "successNode":
{
"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'和'node-endpointfailure'的节点之间的所有可能路由。在本例中,有两种可能的方式从“开始”(数据结构中的节点根)和“结束”和“失败”(节点端点失败)开始:
[
failureNode.failureNode.failureNode.failureNode,
failureNode.successNode.failureNode.failureNode
]
大多数应用程序都使用jQuery,因此纯Javascript或jQuery解决方案都可以工作。这应该可以完成以下任务:
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);
函数递归(从、到、节点){
var结果=[],
选项=[“SuccessNode”、“failureNode”];
如果(!from&&to==node.id)
返回[];
if(from==node.id)
返回递归(null、to、node);
对于(var i=0;i我发现您选择的表示法有点奇怪和混乱。树不是表示这一点的最佳方式。您所描述的本质上是一个DAG(有向无环图)。递归表示法最终会复制对象。虽然我确信还有其他表示方法,但简单的表示法只是列出每个节点,其中包含由id标识的成功和失败节点。停止节点将具有空值(或零长度字符串,以两者为准)它们的成功和失败节点。或者,您可以拥有一个包含所有节点的字典
例如,您的图形可以(按列表)描述为:
使编辑图形变得非常容易。只需根据需要添加或删除节点及其值。我可能会使用另一个对象作为字典,以便更快/更容易地找到每个节点。假设我确实有这样一个字典dict
,从一个节点导航到另一个节点以查看最终结果并不困难。您的json无效…刚刚在jsonlint.comjQuery上检查过,对数据操作没有帮助,我删除了标记,所以你的JSON代表一个二叉树还是什么?你尝试过什么?我想你会发现,当你发布你尝试过的东西时,你更有可能得到帮助。现在你的问题是建议社区为你的或者你只是想补充一下wirey所说的,你永远不应该在结束括号前加逗号,这是无效的JSON(请参阅)。你似乎在请求某种算法来实现你的愿望。正如这里经常需要重复的那样,“你尝试了什么?”。+1表示“奇怪和混乱的表示”。但是,为什么首先要使用节点数组而不是对象(节点id)?使用数组有一些优点。它允许通过网格轻松表示,并且非常适合某些javascript MVC框架(特别是Backbone.js)处理模型集合,当然,您可以按照自己喜欢的方式对节点进行排序浏览器你必须对对象键名非常小心,至少这样,如果你必须丑化键使其工作,可以在幕后进行。当然,如果你使用对象符号,去掉id字段,它会更短,并且一种表示形式是从另一种表示形式派生出来的。我想我展示了数组represe强调OP应该处理的东西的集合性质,而不是使事情过于复杂。是的,结构很奇怪——当你有这样的循环时,它根本没有意义。这曾经是一个严格的二叉树图,变成了一个像JayC一样的DAG。我希望这个数据结构可以被挽救,但是它看起来不太可能成功。我想回过头来注意一下,我最终将数据结构更改为JayC在回答中建议的数据结构。我将Bergi标记为解决方案,因为它解决了问题,即使问题不好。
[
{
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: ""
}
]