6

我必须根据用户输入创建报告。用户回答一个问题,然后根据答案,我以树状结构向左或向右移动,并提出一个新问题。一些节点将有相同的问题,但不同的子节点。我不确定在代码可读性方面最好的方法是什么?

我想避免使用庞大的控制结构,因为它非常难以阅读,如下所示:

if() {
    if() {
        if() {
            if() {
                ... 
            }
        }
        else {
            if() {
                ...
            }
        }
    }
    else {
        ...
    }
}
else {
    if() {
        if() {
            if() {
                ...
            }
        }
        else {
            if () {
                ...
            }
        }
    }
}

有没有更好的方法来处理它?这是我的树的样子

在此处输入图像描述

4

2 回答 2

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

希望有帮助。

于 2013-03-14T09:59:16.010 回答
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 答案,因此我可以使用确认,您将希望使用一个数组,其中每个可能的答案都有一个条目。

你说有些问题是重复的,所以我很想为每个独特的问题文本设置一个数组。然后您的答案数组将索引存储到问题数组中以保存重复文本。

于 2013-03-15T15:57:46.110 回答