對”心理學測測你的本命專業“的實現與算法的簡要分析


對”心理學測測你的本命專業“的實現與算法的簡要分析

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM