我在寻找基于问题选项的所有可能的问题答案路径,我一整天都在绞尽脑汁,似乎无法理解为什么我的代码不起作用。
测试代码:
const originalQuestions = {
1: {
title: "Title",
firstQuestion: true,
options: [{
tooltip: "",
nextQuestion: 2
}, {
tooltip: "",
nextQuestion: 2
}, {
tooltip: "",
nextQuestion: 10000
}]
},
2: {
title: "Title",
options: [{
tooltip: "",
nextQuestion: 3
}, {
tooltip: "",
nextQuestion: 3
}, {
tooltip: "",
nextQuestion: 3
}, {
tooltip: "",
nextQuestion: 3
}]
},
3: {
title: "Title",
options: [{
tooltip: "",
nextQuestion: 4
}, {
tooltip: "",
nextQuestion: 4
}, {
tooltip: "",
nextQuestion: 4
}]
},
4: {
title: "Title",
options: [{
tooltip: "",
nextQuestion: 13
}, {
tooltip: "",
nextQuestion: 5
}]
},
5: {
title: "Title",
options: [{
tooltip: "",
nextQuestion: 6
}, {
tooltip: "",
nextQuestion: 6
}, {
tooltip: "",
nextQuestion: 6
}, {
tooltip: "",
nextQuestion: 10000
}]
},
6: {
title: "Title",
options: [{
tooltip: "",
nextQuestion: 7
}, {
tooltip: "",
nextQuestion: 7
}, {
tooltip: "",
nextQuestion: 7
}, {
tooltip: "",
nextQuestion: 7
}, {
tooltip: "",
nextQuestion: 14
}]
},
7: {
title: "Title",
options: [{
tooltip: "",
nextQuestion: 17
}, {
tooltip: "",
nextQuestion: 17
}, {
tooltip: "",
nextQuestion: 17
}, {
tooltip: "",
nextQuestion: 17
}, {
tooltip: "",
nextQuestion: 17
}]
},
8: {
title: "Title",
options: [{
tooltip: "",
nextQuestion: 9
}, {
tooltip: "",
nextQuestion: 9
}, {
tooltip: "",
nextQuestion: 9
}]
},
9: {
title: "Title",
options: [{
tooltip: "",
nextQuestion: 10
}, {
tooltip: "",
nextQuestion: 10
}, {
tooltip: "",
nextQuestion: 10
}]
},
10: {
title: "Title",
options: [{
tooltip: "",
nextQuestion: 11
}, {
value: "Roof",
attribute: "Flue Exit",
tooltip: "",
nextQuestion: 15
}]
},
11: {
title: "Title",
options: [{
tooltip: "",
nextQuestion: 12
}, {
tooltip: "",
nextQuestion: 12
}]
},
12: {
finalQuestion: true,
input: true,
placeHolder: 'e.g SWS'
},
13: {
title: "Title",
options: [{
tooltip: "",
nextQuestion: 6
}, {
tooltip: "",
nextQuestion: 6
}]
},
14: {
title: "Title",
options: [{
tooltip: "",
nextQuestion: 7
}, {
tooltip: "",
nextQuestion: 7
}, {
tooltip: "",
nextQuestion: 10000
}]
},
15: {
title: "Title",
options: [{
tooltip: "",
nextQuestion: 12
}, {
tooltip: "",
nextQuestion: 12
}]
},
17: {
title: "Title",
options: [{
tooltip: "",
nextQuestion: 8
}, {
tooltip: "",
nextQuestion: 8
}, {
tooltip: "",
nextQuestion: 8
}, {
tooltip: "",
nextQuestion: 8
}, {
tooltip: "",
nextQuestion: 8
}]
},
// Errors
10000: {
isError: true,
title: "Finally, what is the first part of your postcode?",
error: "Postcode"
}
};
function loopPaths(currentArrayPath, questionNum, currentQuestion, paths) {
if (questionNum > 5) {
return false;
}
if (typeof currentQuestion.finalQuestion != 'undefined') {
return false;
} else {
const question = currentQuestion.options;
const validPaths = question.filter((e) => e.nextQuestion !== 10000);
const clonedPath = [...paths[currentArrayPath][0]];
for (var i = 0; i < validPaths.length; i++) {
const e = validPaths[i];
if (typeof paths[currentArrayPath][i] == 'undefined') {
paths[currentArrayPath][i] = [...clonedPath];
}
paths[currentArrayPath][i].push(questionNum);
loopPaths(currentArrayPath, e.nextQuestion, originalQuestions[e.nextQuestion], paths);
}
}
}
function possiblePaths() {
const question1 = originalQuestions[1].options;
const validPaths = question1.filter((e) => e.nextQuestion !== 10000);
let paths = [];
/*validPaths.forEach((e, i) => {
paths[i] = [[1]];
});*/
/*
for (var i = 0; i < validPaths.length; i++) {
const e = validPaths[i];
loopPaths(e.nextQuestion, boilerQuestions[e.nextQuestion], paths);
} */
// Testing with first question, first option
paths[0] = [[1]];
loopPaths(0, 2, originalQuestions[2], paths);
console.log(paths);
}
possiblePaths();
似乎正在发生的事情:(它没有建立正确的路径,也没有构建不同的可能性)
[
[
[
1,
2,
3,
4,
5,
4,
5,
4,
5,
3,
4,
5,
4,
5,
4,
5,
3,
4,
5,
4,
5,
4,
5,
3,
4,
5,
4,
5,
4,
5
],
[
1,
2,
3,
4,
5,
3,
4,
5,
4,
5,
2,
4,
5,
3,
4,
5,
4,
5,
4,
5,
3,
4,
5,
4,
5,
4,
5,
3,
4,
5,
4,
5
]
]
]
应该展示的例子:(我想知道是否有一种更简单的方法来构建从1 ->到最后一个问题(12)的不同可能性)
[
[
[
1,
2,
3,
4,
13,
7,
17,
8,
9,
10,
11,
12
],
[
1,
2,
3,
4,
5,
6,
7,
....
]
]
]
它将如何工作:
用户点击问题1 ->按压选项1 ->用户点击问题2 ->页面选项2 ->用户点击问题3 ->页面选项1 ->用户点击问题4 ->用户点击问题1 ->用户点击问题13
发布于 2021-06-18 08:30:39
您可以使用递归生成器函数。
const originalQuestions = { 1: { title: "Title", firstQuestion: true, options: [{ tooltip: "", nextQuestion: 2 }, { tooltip: "", nextQuestion: 2 }, { tooltip: "", nextQuestion: 10000 }] }, 2: { title: "Title", options: [{ tooltip: "", nextQuestion: 3 }, { tooltip: "", nextQuestion: 3 }, { tooltip: "", nextQuestion: 3 }, { tooltip: "", nextQuestion: 3 }] }, 3: { title: "Title", options: [{ tooltip: "", nextQuestion: 4 }, { tooltip: "", nextQuestion: 4 }, { tooltip: "", nextQuestion: 4 }] }, 4: { title: "Title", options: [{ tooltip: "", nextQuestion: 13 }, { tooltip: "", nextQuestion: 5 }] }, 5: { title: "Title", options: [{ tooltip: "", nextQuestion: 6 }, { tooltip: "", nextQuestion: 6 }, { tooltip: "", nextQuestion: 6 }, { tooltip: "", nextQuestion: 10000 }] }, 6: { title: "Title", options: [{ tooltip: "", nextQuestion: 7 }, { tooltip: "", nextQuestion: 7 }, { tooltip: "", nextQuestion: 7 }, { tooltip: "", nextQuestion: 7 }, { tooltip: "", nextQuestion: 14 }] }, 7: { title: "Title", options: [{ tooltip: "", nextQuestion: 17 }, { tooltip: "", nextQuestion: 17 }, { tooltip: "", nextQuestion: 17 }, { tooltip: "", nextQuestion: 17 }, { tooltip: "", nextQuestion: 17 }] }, 8: { title: "Title", options: [{ tooltip: "", nextQuestion: 9 }, { tooltip: "", nextQuestion: 9 }, { tooltip: "", nextQuestion: 9 }] }, 9: { title: "Title", options: [{ tooltip: "", nextQuestion: 10 }, { tooltip: "", nextQuestion: 10 }, { tooltip: "", nextQuestion: 10 }] }, 10: { title: "Title", options: [{ tooltip: "", nextQuestion: 11 }, { value: "Roof", attribute: "Flue Exit", tooltip: "", nextQuestion: 15 }] }, 11: { title: "Title", options: [{ tooltip: "", nextQuestion: 12 }, { tooltip: "", nextQuestion: 12 }] }, 12: { finalQuestion: true, input: true, placeHolder: 'e.g SWS' }, 13: { title: "Title", options: [{ tooltip: "", nextQuestion: 6 }, { tooltip: "", nextQuestion: 6 }] }, 14: { title: "Title", options: [{ tooltip: "", nextQuestion: 7 }, { tooltip: "", nextQuestion: 7 }, { tooltip: "", nextQuestion: 10000 }] }, 15: { title: "Title", options: [{ tooltip: "", nextQuestion: 12 }, { tooltip: "", nextQuestion: 12 }] }, 17: { title: "Title", options: [{ tooltip: "", nextQuestion: 8 }, { tooltip: "", nextQuestion: 8 }, { tooltip: "", nextQuestion: 8 }, { tooltip: "", nextQuestion: 8 }, { tooltip: "", nextQuestion: 8 }] }, 10000: { isError: true, title: "Finally, what is the first part of your postcode?", error: "Postcode" } };
function* fnName(key, result = [key]) {
let options = originalQuestions[key]?.options;
if (!options) yield result
else for (const id of new Set(options.map(v => v.nextQuestion)))
yield* fnName(id, result.concat(id));
}
console.log("Prettify", Array.from(fnName(1), path => path.join(", ")))
我简单地通过第一个问题id (fnName(1)
),在这个例子中它的编号是1
,因为这是第一个问题。(originalQuestions[1].firstQuestion = true
)
发布于 2021-06-18 09:38:33
努尔最棒的答案就是我会怎么解决这个问题。我可能会建议做一些改变,这样就有足够的不同,可以单独发布一个帖子-
function* paths(t, key) {
const { options } = t[key] ?? {}
if (options == null) return yield [key]
for (const id of new Set(options.map(v => v.nextQuestion)))
for (const path of paths(t, id))
yield [key, ...path]
}
const originalQuestions =
{ 1: { title: "Title", firstQuestion: true, options: [{ tooltip: "", nextQuestion: 2 }, { tooltip: "", nextQuestion: 2 }, { tooltip: "", nextQuestion: 10000 }] }, 2: { title: "Title", options: [{ tooltip: "", nextQuestion: 3 }, { tooltip: "", nextQuestion: 3 }, { tooltip: "", nextQuestion: 3 }, { tooltip: "", nextQuestion: 3 }] }, 3: { title: "Title", options: [{ tooltip: "", nextQuestion: 4 }, { tooltip: "", nextQuestion: 4 }, { tooltip: "", nextQuestion: 4 }] }, 4: { title: "Title", options: [{ tooltip: "", nextQuestion: 13 }, { tooltip: "", nextQuestion: 5 }] }, 5: { title: "Title", options: [{ tooltip: "", nextQuestion: 6 }, { tooltip: "", nextQuestion: 6 }, { tooltip: "", nextQuestion: 6 }, { tooltip: "", nextQuestion: 10000 }] }, 6: { title: "Title", options: [{ tooltip: "", nextQuestion: 7 }, { tooltip: "", nextQuestion: 7 }, { tooltip: "", nextQuestion: 7 }, { tooltip: "", nextQuestion: 7 }, { tooltip: "", nextQuestion: 14 }] }, 7: { title: "Title", options: [{ tooltip: "", nextQuestion: 17 }, { tooltip: "", nextQuestion: 17 }, { tooltip: "", nextQuestion: 17 }, { tooltip: "", nextQuestion: 17 }, { tooltip: "", nextQuestion: 17 }] }, 8: { title: "Title", options: [{ tooltip: "", nextQuestion: 9 }, { tooltip: "", nextQuestion: 9 }, { tooltip: "", nextQuestion: 9 }] }, 9: { title: "Title", options: [{ tooltip: "", nextQuestion: 10 }, { tooltip: "", nextQuestion: 10 }, { tooltip: "", nextQuestion: 10 }] }, 10: { title: "Title", options: [{ tooltip: "", nextQuestion: 11 }, { value: "Roof", attribute: "Flue Exit", tooltip: "", nextQuestion: 15 }] }, 11: { title: "Title", options: [{ tooltip: "", nextQuestion: 12 }, { tooltip: "", nextQuestion: 12 }] }, 12: { finalQuestion: true, input: true, placeHolder: 'e.g SWS' }, 13: { title: "Title", options: [{ tooltip: "", nextQuestion: 6 }, { tooltip: "", nextQuestion: 6 }] }, 14: { title: "Title", options: [{ tooltip: "", nextQuestion: 7 }, { tooltip: "", nextQuestion: 7 }, { tooltip: "", nextQuestion: 10000 }] }, 15: { title: "Title", options: [{ tooltip: "", nextQuestion: 12 }, { tooltip: "", nextQuestion: 12 }] }, 17: { title: "Title", options: [{ tooltip: "", nextQuestion: 8 }, { tooltip: "", nextQuestion: 8 }, { tooltip: "", nextQuestion: 8 }, { tooltip: "", nextQuestion: 8 }, { tooltip: "", nextQuestion: 8 }] }, 10000: { isError: true, title: "Finally, what is the first part of your postcode?", error: "Postcode" } }
for (const path of paths(originalQuestions, 1))
console.log(path.join(" -> "))
.as-console-wrapper { min-height: 100%; }
1 -> 2 -> 3 -> 4 -> 13 -> 6 -> 7 -> 17 -> 8 -> 9 -> 10 -> 11 -> 12
1 -> 2 -> 3 -> 4 -> 13 -> 6 -> 7 -> 17 -> 8 -> 9 -> 10 -> 15 -> 12
1 -> 2 -> 3 -> 4 -> 13 -> 6 -> 14 -> 7 -> 17 -> 8 -> 9 -> 10 -> 11 -> 12
1 -> 2 -> 3 -> 4 -> 13 -> 6 -> 14 -> 7 -> 17 -> 8 -> 9 -> 10 -> 15 -> 12
1 -> 2 -> 3 -> 4 -> 13 -> 6 -> 14 -> 10000
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 17 -> 8 -> 9 -> 10 -> 11 -> 12
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 17 -> 8 -> 9 -> 10 -> 15 -> 12
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 14 -> 7 -> 17 -> 8 -> 9 -> 10 -> 11 -> 12
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 14 -> 7 -> 17 -> 8 -> 9 -> 10 -> 15 -> 12
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 14 -> 10000
1 -> 2 -> 3 -> 4 -> 5 -> 10000
1 -> 10000
https://stackoverflow.com/questions/68037804
复制相似问题