Angular 创建一个遵循决策树的有角度的形状

Angular 创建一个遵循决策树的有角度的形状,angular,decision-tree,angular-forms,Angular,Decision Tree,Angular Forms,我想建立一个Angular应用程序,向用户提问,并根据他们的答案生成下一个问题(遵循决策树) 例如(我将公开多个场景,每一个场景在一行上,问题以斜体显示,答案以粗体显示): 胸痛? 是/\n否 费率? 100 海波? 否/\是 **稳重**(决策树的结果) 你能给我一些关于如何做到这一点的线索吗?这看起来像一棵树(或一个图形)。我应该将我的问题存储在这样的数据结构中吗?类似的东西对您有用吗 public readonly countries=[“法国”、“德国”]; 公共只读城市={ “法国”

我想建立一个Angular应用程序,向用户提问,并根据他们的答案生成下一个问题(遵循决策树)

例如(我将公开多个场景,每一个场景在一行上,问题以斜体显示,答案以粗体显示):

胸痛? 是/\n否 费率? 100 海波? 否/\是 **稳重**(决策树的结果) 你能给我一些关于如何做到这一点的线索吗?这看起来像一棵树(或一个图形)。我应该将我的问题存储在这样的数据结构中吗?

类似的东西对您有用吗

public readonly countries=[“法国”、“德国”];
公共只读城市={
“法国”:[“巴黎”、“里昂”、“马赛”],
“德国”:[“柏林”、“法兰克福”、“汉堡”]
};
公共选择={
国家:“,
城市:''
};
选择国家
{{c}}


挑选城市 {{c}}
从最初的顶级选择开始,然后根据上一个答案显示下一个问题

更新1:我已经根据您发布的图表修改了答案。新的解决方案不使用硬编码路径,而是定义一个“决策树”结构并使用它。我将在后面进行更详细的解释,但本质是您只需要修改一个变量的内容,应用程序仍然可以工作

其思想是将树中的每个节点存储为如下对象:

导出类树节点{
公共只读id:nodeId;
公共只读说明:字符串;
公共决策:布尔|空;
public readonly yesId:nodeId | null;
公共只读noId:nodeId | null;
建造师(
id:nodeId,
描述:字符串,
yesId:nodeId | null,
noId:nodeId | null
) {
this.id=id;
this.description=描述;
this.decision=null;//node.yesId==null&&node.noId==null;
私有pushNode():void{
这个。决策树。推({
节点:this.currentNode,
索引:this.decisionTree.length
});
}
}
reset()中
方法我只需将
currentNode
初始化为胸痛问题,其余部分由用户选择处理。我将路径保留为数组,以在到达叶节点时显示最终结果。查看我在stackblitz中准备的示例HTML,但在这种情况下,演示与此无关。您可以调整我不能满足你的需要

我认为这是一个不错的解决方案,您只需要更改
节点列表
,表单就会根据在那里找到的值工作

限制:这目前只适用于是/否类型的问题。如果您希望有多个选择,您可以尝试将问题“重构”为多个真/假问题。否则,我们可以进一步讨论。

类似的问题对您有用吗

public readonly countries=[“法国”、“德国”];
公共只读城市={
“法国”:[“巴黎”、“里昂”、“马赛”],
“德国”:[“柏林”、“法兰克福”、“汉堡”]
};
公共选择={
国家:“,
城市:''
};
选择国家
{{c}}


挑选城市 {{c}}
从最初的顶级选择开始,然后根据上一个答案显示下一个问题

更新1:我根据您发布的图表修改了答案。新的解决方案不使用硬编码路径,而是定义了一个“决策树”结构并使用了它。我将在后面进行更详细的解释,但本质是您只需修改一个变量的内容,应用程序仍然可以工作

其思想是将树中的每个节点存储为如下对象:

导出类树节点{
公共只读id:nodeId;
公共只读说明:字符串;
公共决策:布尔|空;
public readonly yesId:nodeId | null;
公共只读noId:nodeId | null;
建造师(
id:nodeId,
描述:字符串,
yesId:nodeId | null,
noId:nodeId | null
) {
this.id=id;
this.description=描述;
this.decision=null;//node.yesId==null&&node.noId==null;
私有pushNode():void{
这个。决策树。推({
节点:this.currentNode,
索引:this.decisionTree.length
});
}
}
reset()中
方法我只需将
currentNode
初始化为胸痛问题,其余部分由用户选择处理。我将路径保留为数组,以在到达叶节点时显示最终结果。查看我在stackblitz中准备的示例HTML,但在这种情况下,演示与此无关。您可以调整我不能满足你的需要

我认为这是一个不错的解决方案,您只需要更改
节点列表
,表单就会根据在那里找到的值工作


限制:这目前只适用于是/否类型的问题。如果您希望有多个选择,您可以尝试“重构”问题应该是多个真/假问题。否则,我们可以进一步讨论。

您好,它工作得很好。我的决策树很大。我编辑了我的问题描述,想知道是否应该将所有问题存储在树数据结构中。您认为这会有帮助吗?您能提供一个更大的决策树吗?至少有一个完成了两条路径,现在只有1条。嗨,这是我目前的工作(还没有完成,但它会给你一个更好的主意)。菱形是肯定/否定的答案。减半的矩形(速率)应该是一个包含3个项目的下拉列表。我只画了一个项目的路径,正常的矩形代表结果。希望能有所帮助。谢谢展示
                  CHEST PAIN ? 
                yes/          \no
                              RATE?
                         <60 /    \ >100
                                 HYPO ?
                              no/    \ yes
                                     **SEDATE**(result of the decision tree)