我如何将此工作流表示为JavaScript数据结构?

时间:2013-11-20 21:16:57

标签: javascript data-structures recursion nodes tree-nodes

我正在处理一个非常复杂的工作流程,我希望将其表示为JavaScript数据结构。流程本质上是一组问题和答案,其中一个问题的答案影响下一个问题。以下是流程可能的基本示例:

enter image description here

我不确定如何将此流转换为易于使用的JavaScript对象。理想情况下,我希望有一个易于循环/递归的结构,并且很容易修改,所以如果有人想在以后改变流程,他们可以这样做,而不必进行太多的更改。

我觉得这是一种奇怪的树结构,其中节点可以有多个父节点。 (我不确定这样的数据结构是什么。)

无论如何,我唯一的想法是为每个节点分配一个ID,然后创建一个节点对象数组,如下所示:

{
  id: 5,
  parents: [2, 3],
  children: [6, 7, 8]
}

然而,当涉及到循环遍历节点对象时,这似乎非常不灵活(尽管我可能错了)。

如果有人可以提供一些关于我应该研究什么样的数据结构以及可能如何在JavaScript中实现它们的指导/指导,我将非常感激。

非常感谢你。

2 个答案:

答案 0 :(得分:7)

您的初步想法将适合您的方案。此外,您已经回答了有关数据结构的问题:JSON。我会坚持下去。

我唯一能做的就是改变:我认为你不需要拯救父母,除非你不得不回答问题。
如果是这种情况,您就拥有directed acyclic graph,这是我可以根据您的情况考虑的唯一结构。
有一些框架负责在JS中实现和可视化这些图形,请参考this question

如果您要自己实现此结构,这里有一些(非常基本的)代码可以帮助您入门:

var graph = graph || {};

graph.nodes = [
  {id:1, children:[2,3]},
  {id:2, children:[]},
  {id:3, children:[4]},
  {id:4, children:[]}
];

//Returns the next question-id for an answer-id
//or -1 if this was the last answer
graph.nextQForA = function(aId) {
  for(var i = 0; i < graph.nodes.length; i++)
  {
    if(graph.nodes[i].id === aId && graph.nodes[i].children.length > 0 )
      return graph.nodes[i].children[0];
  }

  return -1;
}

此处显示的用法(Chrome控制台):
enter image description here

遍历也可以递归而不是迭代完成。

答案 1 :(得分:0)

您可以考虑使用ChoiceScript。这是一个非常容易获取基于Javascript的库,允许您创建自己的问答类型的网站,看起来它可以很好地满足您的需求。

就像在您的工作流程中一样,ChoiceScript允许动态的问题和答案,这意味着您对一个问题的回答可能会影响您收到的下一个问题(就像您在OP中详述的那样)。

链接:http://www.choiceofgames.com/make-your-own-games/choicescript-intro/

ChoiceScript主要用于创建游戏,但它看起来也适合您的需求。以下是使用此JavaScript库创建的游戏示例:

https://www.choiceofgames.com/ninja/#utm_source=cog&utm_medium=web&utm_content=ourgames