我必须根据用户输入创建报告。用户回答一个问题,然后根据答案我在树状结构中向左或向右走,并提出一个新问题。一些节点将有相同的问题,但不同的孩子。我不确定在代码可读性方面最好的方法是什么?
我想避免使用巨大的控制结构,因为它非常难以理解,如下所示:
if() {
if() {
if() {
if() {
...
}
}
else {
if() {
...
}
}
}
else {
...
}
}
else {
if() {
if() {
if() {
...
}
}
else {
if () {
...
}
}
}
}
有没有更好的方法来处理它?这是我的树看起来像的图像
答案 0 :(得分:2)
如果您使用的是mysql,那么只需要一个表格来提问题,并提供一个表格来获得如下答案:
问题表:
+----------+-----------+
| id | question |
+----------+-----------+
| 1 | Question 1|
+----------+-----------+
| 2 | Question 2|
+----------+-----------+
| 3 | Question 3|
+----------+-----------+
答案表:
+----------+-----------+-----------+---------------+
| id | answer | question | next_question |
+----------+-----------+-----------+---------------+
| 1 | Answer 1 | 1 | 2 |
+----------+-----------+-----------+---------------+
| 2 | Answer 2 | 1 | 3 |
+----------+-----------+-----------+---------------+
如果用户在问题1并选择第一个答案,他们会转到问题2.如果他们选择第二个答案,他们会转到问题3.
因此,在您的代码中,只需使用id:
在每个答案后查询数据库SELECT next_question FROM answers WHERE id = ?; // Change '?' depending on answer to get next question
然后得到下一个答案:
SELECT answer FROM answers WHERE question = ?; // Change '?' depending on previous value retrieved
希望有所帮助。
答案 1 :(得分:2)
将树存储为数据,然后您的代码可能非常小。如果我们稍微修改@ jam6549给出的答案,我们可以想出这样的事情:
var answer = [ {t: "Does it have fur?", y: 1, n: 2},
{t: "Is it a kitten?", y: 3, n: 4},
{t: "Is it a goldfish?", y: 5, n: 4},
{t: "Found a kitten", y: -1, n: -1},
{t: "I'm stumped", y: -1, n: -1},
{t: "Found a goldfish", y: -1, n: -1} ];
var state = 0;
while ( answer[state].y >= 0 ) {
var choice = confirm(answer[state].t);
state = choice? answer[state].y: answer[state].n;
}
alert(answer[state].t);
这仅支持简单的y / n答案,因此我可以使用确认,您将要使用带有每个可能答案的条目的数组。
你说有些问题是重复的,所以我很想有一个带有每个独特问题文本的数组。然后你的答案数组将一个索引存储到问题数组中以保存重复的文本。