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 结果 - 通过
    • inClassTest 结果 - 失败
    • 考试成绩 - 通过
    • 总体结果 - 通过

我可以使用 JSON 路径来完成,但它没有像 jQuery QueryBuilder 这样的图形查询构建器。我遇到的主要问题是我不明白如何使用 jQuery QueryBuilder 生成的 JSON 输出来评估我拥有的数据。可以用 jQuery QueryBuilder 做我想做的事吗?有没有其他的javascript工具可以做到这一点?

4

1 回答 1

2

我回答这个问题有点晚了,希望你现在有一个解决方案。

最近,我也在我的一个项目中使用了 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 回答