2013-11-20 75 views
7

我正在處理一個非常複雜的工作流程,我想將其表示爲JavaScript數據結構。流程本質上是一組問題和答案,其中一個問題的答案影響下一個問題。以下是流動可能看起來像一個簡單的例子:我將如何將這個工作流程表示爲JavaScript數據結構?

enter image description here

我不知道如何將這種流量轉換成一個JavaScript對象,很容易的工作。理想情況下,我希望有一個容易循環/遞歸的結構,而且這個結構很容易修改,所以如果有人想在稍後改變流程,他們可以做到這一點,而無需做太多的改變。

我覺得這是某種奇怪的樹結構,其中節點可以有多個父節點。 (我不知道這樣的數據結構被稱爲什麼)。

無論如何,我唯一的想法是爲每個節點分配一個ID,然後創建一個如下節點對象的數組:

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

但是,這似乎真的僵化,當涉及到循環通過節點對象(我可能是錯誤的,雖然)。

如果任何人都可以請提供一些關於我應該研究的數據結構的指導和指導,以及如何用JavaScript實現它們,我會非常感激。

非常感謝您提前。

+3

這看起來像一個有向圖,或向圖。 – glomad

+0

謝謝,ithcy。我會研究這兩個並報告回來。 – HartleySan

+0

這可能值得查找:http://stackoverflow.com/a/6894080/2282538 – Tyler

回答

6

您的初步想法將適合您的情況。此外,您已經回答了您自己關於數據結構的問題: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

遍歷也可以遞歸地完成,而不是迭代。

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

相關問題