1

私は学生の成績を評価するシステムを持っています。JSON オブジェクトで動的に評価基準を定義できるはずです。たとえば、次の場合、学生は Java プログラミング モジュールに合格します。

(courseWorkMarks > 30 && inClassTest > 40) || examMarks > 40 // pass

条件はモジュールごとに異なるため、各モジュールには評価基準を記述する json オブジェクトがあります。これを行うためにJquery QueryBuilderを使用することを考えました。UI を使用して式を作成し、JSON として保存できます。モジュールの学生のマーク リストは、次のような JSON オブジェクトにあります。

{courseWorkMarks: 50, inClassTest: 35, examMarks: 45}
  1. jQuery QueryBuilder によって生成された JSON を使用して、この学生が合格基準を満たしているかどうかを確認するにはどうすればよいですか?

  2. 各条件の合否判定基準を個別に表示したい。上記の場合の例:

    • courseWorkMarks 結果 - PASS
    • inClassTest の結果 - 不合格
    • 試験成績 - 合格
    • 総合結果 - 合格

JSON パスで実行できますが、jQuery QueryBuilder のような優れたグラフィカル クエリ ビルダーがありません。私が抱えている主な問題は、jQuery QueryBuilder によって生成された JSON 出力を使用して、所有しているデータを評価する方法を理解していないことです。jQuery QueryBuilder で私がやりたいことをすることは可能ですか? これを行うための他の JavaScript ツールはありますか?

4

1 に答える 1

2

この質問への回答が少し遅れました。うまくいけば、今までに解決策が見つかりました。

最近、プロジェクトの 1 つで jQuery QueryBuilder も使用し、次の解決策を見つけました。

var lastOperator = [];
var rulesLengths = [];
var ruleLevel = 0;
var equationString = '';
var rulesData = {
     "condition": "AND",
     "rules": [
        {
           "id": "genderSelect",
           "field": "genderSelect",
           "type": "string",
           "input": "select",
           "operator": "equal",
           "value": "Male"
        },
        {
           "id": "ageSelect",
           "field": "ageSelect",
           "type": "string",
           "input": "select",
           "operator": "equal",
           "value": "18-26"
        }
     ],
     "valid": true,
  };

var expr = checkDisplayLogic(rulesData);
var flag = eval(expr);
/** Recursive function to convert json data to expression **/
function checkDisplayLogic(rulesData) {
    if (rulesData['rules'] !== undefined) {
        ruleLevel++;
        var operator = rulesData['condition'];
        lastOperator.push(operator);
        rulesLengths.push(rulesData.rules.length);
        equationString += '(';
        $.each(rulesData.rules, function (idx, elem) {
            checkDisplayLogic(elem);
            if (rulesLengths[rulesLengths.length - 1] == idx + 1) {
                equationString += ')';;
                rulesLengths.pop();
                ruleLevel--;
                lastOperator.pop();
            }
            else {
                if (lastOperator.length !== 0)
                    equationString += ' ' + (operator === 'AND' ? '&&' : '||' ) + ' ';
            }
        });
    }
    else {
        var inputType = rulesData.input;
        switch (inputType) {
            case 'select':
                var ctrl = $('#' + rulesData.id);
                //Below logic will change depending upon the operator selected in QueryBuilder. 
                //In my case operator is 'equal' that's why I am using '===' operator for comparison
                equationString += (ctrl.val() === rulesData.value).toString();
                break;
            /****** Similarly create cases for other input types QueryBuilder provide ********/
        }
    }

    return equationString;
} 

ハッピーコーディング!

于 2018-05-04T12:29:30.367 に答える