对”心理学测测你的本命专业“的简要分析
1. 使用谷歌浏览器打开https://cdn-act.knowyourself.cc/life_profession/。
2. Fn+F12打开开发者工具。
3. 在Sources中搜索字符串,例如“土木”,搜索结果如图1所示。
图1 搜索“土木”
4. 进入console,同时答题。可以看到两个index.tsc文件分别记录了答题的选项以及最后的结果,如图2所示。
图2 答题后的控制台输出
5. 进入result.js,里面有一个getResult()函数。分析得到此文件是对用户的选择处理,可以发现最后的结果是在前端判定的。
getResult()
-
功能:处理用户的选择,返回结果。
-
参数:select,用户的选择,是一个二维数组,表示第几题,以及用户选择了哪几个选项。
-
返回:max,对应专业编号。
-
过程:
定义每道题每个选项对应的专业。用数组存储,一般为多个。
处理select。找到用户选择的选项数组对应的专业数组,并将其通过连接的方式存储在result数组中。
处理result。处理前先打乱result,处理后存储入result_map中,result_map的key为专业的编号,value为对应出现的次数。记录下专业出现次数最多的编号,并赋值给max。 -
注:
- 函数参数只有select,即用户选择的选项。所以最后的结果与用户答题前填写和选择的专业、姓名和性别无关。
- 每个选项对应的专业数组中,其中第十题的答案,不对应任何一个专业,如图3所示。所以无论第十题选什么都不会影响之前选择的结果。
图 3 第十题对应的专业
- 若多个value为max时,选取第一次value为max的key,如图4所示。并且这个key是随机的。在处理result_map前,对result数组打乱顺序,也就是说,固定选项,max对应的value若存在多个,得到的key可能不一样。
简单测试:五次固定选项时,得到的结果都是同一个值。
图 4 max的判定
- 题目的顺序不影响答题结果。
附录:
result.js完整代码如下所示。
// 结果页id:
// 0:经济学
// 1:哲学
// 2:法学
// 3:社会学
// 4:教育学
// 5:汉语言文学
// 6:外国语言学
// 7:新闻学
// 8:历史学
// 9:数学
// 10:物理学
// 11:化学
// 12:生命科学
// 13:地理学
// 14:心理学
// 15:计算机科学与技术
// 16:土木工程学
// 17:建筑学
// 18:机电工程学
// 19:农林学
// 20:医学
// 21:管理学
// 22:艺术
// 23:戏剧影视导演
// 24:表演艺术
// 25:体育学
// 26:考古学
// 27:电子竞技
//10道题,选择传入数组,因为有多选,数组内套数组
//选择顺序从0开始算,0代表第一个选项,1代表第二个...
//例如 select :[[0],[1],[3],[0],[0,1,2,3],[0,1,2,3,4],[0]]
function getResult(select) {
if (!Array.prototype.shuffle) {
Array.prototype.shuffle = function() {
for (var j, x, i = this.length; i; j = parseInt(Math.random() * i),
x = this[--i],
this[i] = this[j],
this[j] = x)
return this;
}
;
}
var config = {
0: {
0: [1, 0, 2, 3, 4, 5, 6, 7, 8, 21, 26],
1: [9, 10, 11, 12, 13, 14, 15