10

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

在此处输入图像描述

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

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

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

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

但是,在遍历节点对象时,这似乎非常不灵活(不过我可能是错的)。

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

非常感谢您提前。

4

2 回答 2

10

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

只有一件事我会改变:我认为你不需要拯救父母,除非你必须从一个问题的答案返回。
如果是这种情况,你有一个有向无环图,这是我能想到的唯一结构。
有一些框架负责在 JS 中实现和可视化这些图表,请参阅这个问题

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

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 控制台):
在此处输入图像描述

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

于 2013-11-20T21:28:12.090 回答
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

于 2013-11-20T21:49:02.807 回答