【问题标题】:How would I represent this workflow as a JavaScript data structure?我如何将此工作流表示为 JavaScript 数据结构?
【发布时间】:2013-12-05 02:39:49
【问题描述】:

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

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

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

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

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

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

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

非常感谢您。

【问题讨论】:

  • 这看起来像一个有向图或有向图。
  • 谢谢你,ithcy。我会调查这两个并报告。
  • 这可能值得研究:stackoverflow.com/a/6894080/2282538
  • 对不起 - digraph 是有向图的另一个名称。

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


【解决方案1】:

您最初的想法将适合您的场景。此外,您已经回答了有关数据结构的问题: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 控制台):

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

【讨论】:

    【解决方案2】:

    您可以考虑为此使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多