对”心理学测测你的本命专业“的实现与算法的简要分析

对”心理学测测你的本命专业“的实现与算法的简要分析

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,对应专业编号。

 

过程:

  1. 定义每道题每个选项对应的专业。用数组存储,一般为多个。
  2. 处理select。找到用户选择的选项数组对应的专业数组,并将其通过连接的方式存储在result数组中。
  3. 处理result。处理前先打乱result,处理后存储入result_map中,result_map的key为专业的编号,value为对应出现的次数。记录下专业出现次数最多的编号,并赋值给max。

注:

  1. 函数参数只有select,即用户选择的选项。所以最后的结果与用户答题前填写和选择的专业、姓名和性别无关。
  2. 每个选项对应的专业数组中,其中第十题的答案,不对应任何一个专业,如图3所示。所以无论第十题选什么都不会影响之前选择的结果。

图 3 第十题对应的专业

  3. 若多个value为max时,选取第一次value为max的key,如图4所示。并且这个key是随机的。在处理result_map前,对result数组打乱顺序,也就是说,固定选项,max对应的value若存在多个,得到的key可能不一样。

  简单测试:五次固定选项时,得到的结果都是同一个值。

图 4 max的判定

  4.题目的顺序不影响答题结果。

 

附录:

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, 16, 17, 18, 19, 20, 26],

            2: [22, 23, 24, 25, 27],

        },

        1: {

            0: [0, 2, 6, 7, 20, 21, 25],

            1: [3, 4, 24],

            2: [5, 14, 22],

            3: [1, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 23, 26, 27],

        },

        2: {

            0: [1, 3, 4, 5, 9, 10, 14, 21, 22, 23, 24, 27],

            1: [0, 2, 6, 7, 8, 11, 12, 13, 15, 16, 17, 18, 19, 20, 25, 26],

        },

        3: {

            0: [0, 2, 3, 4, 6, 7, 20, 21, 24, 25],

            1: [1, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 23, 26, 27],

        },

        4: {

            0: [1, 3, 4, 5, 9, 10, 14, 21, 22, 23, 24, 27],

            1: [0, 2, 6, 7, 8, 11, 12, 13, 15, 16, 17, 18, 19, 20, 25, 26],

        },

        5: {

            0: [1, 0, 2, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 23, 25, 26, 27],

            1: [3, 4, 5, 14, 22, 24],

        },

        6: {

            0: [1, 8, 9, 10, 11, 12, 13, 20, 26],

            1: [5, 22, 23, 24],

            2: [15, 16, 17, 18, 19, 25, 27],

            3: [3, 4, 6, 7, 14],

            4: [0, 2, 21],

        },

        7: {

            0: [1, 8, 9, 10, 11, 12, 13, 20, 26],

            1: [5, 22, 23, 24],

            2: [15, 16, 17, 18, 19, 25, 27],

            3: [3, 4, 6, 7, 14],

            4: [0, 2, 21],

        },

        8: {

            0: [4, 5, 7, 14, 21, 23, 6],

            1: [6, 15],

            2: [13],

            3: [10, 16, 17, 18],

            4: [12, 19, 20, 25],

            5: [1, 2, 7, 21],

            6: [0, 9, 15, 16, 18, 10, 14],

            7: [17, 22, 24, 23],

            8: [3, 8, 26, 13],

            9: [11, 12, 19, 20, 26],

            10: [25, 27],

            11: [22, 24],

        },

        9: {

            0: [],

            1: [],

            2: []

        }

    };

 

    var result = [];

    for (var topic_num = 0; topic_num < select.length; topic_num++) {

        // 遍历本题答案

        for (var j = 0; j < select[topic_num].length; j++) {

            var user_select = select[topic_num][j];

            // 获取配置

            var tmp = config[topic_num][user_select];

            // 合并

            result = result.concat(tmp);

        }

    }

    var result_map = {};

    var max = -1;

    // 打乱一下result结果

    result.shuffle();

    for (var i = 0; i < result.length; i++) {

        if (typeof result_map[result[i]] == "undefined") {

            result_map[result[i]] = 0;

        }

        result_map[result[i]]++;

        if (max == -1) {

            max = result[i];

        } else {

            if (result_map[result[i]] > result_map[max]) {

                max = result[i];

            }

        }

    }

 

    //console.log(result);

    //console.log(result_map);

    //console.log(max);

    return max;

}

 

// test

// console.log(getResult([[0], [3], [0], [1], [0], [0], [0], [0], [0, 5, 6], [1]]));//期望结果 1

//getResult([[1],[3],[1],[1],[1],[0],[2],[2],[1,2,6],[1]]);//期望结果 15

//getResult([[2],[3],[0],[1],[0],[0],[1],[1],[0,7,10],[1]]);//期望结果 23

 

export default getResult;
View Code

 

posted @ 2021-05-29 16:49  Dul  阅读(238)  评论(0编辑  收藏  举报