Javascript来自字符串的布尔比较器

时间:2016-11-21 09:32:57

标签: javascript sql boolean

这里有一个不寻常的问题,也许我正在错误地解决这个问题 -

我想在Javascript中对某些数值进行比较,但我将比较器存储在数据库中(在VARCHAR字段中),其中存储了特定的标准。 (比较器为< =,<,==,>,> =等)。

有没有办法评估在JS中作为比较器返回的字符串?

由于

5 个答案:

答案 0 :(得分:3)

是的,您可以使用比较器作为键的对象并返回一个进行比较的函数。

var comparison = {
    '<=': function (a, b) { return a <= b; },
    '<':  function (a, b) { return a < b; },
    '==': function (a, b) { return a == b; },
    '>':  function (a, b) { return a > b; },
    '>=': function (a, b) { return a >= b; },
    default: function () { return false; }
}

用法:

(comparison[comp] || comparison.default)(value1, value2);

答案 1 :(得分:1)

,但除非您将其用于完全受信任的数据,否则请勿使用它。

相反,实施比较:

function compare(operator, operand1, operand2) {
    switch (operator) {
        case "<=":
            return operand1 <= operand2;
        case ">=":
            return operand1 >= operand2;
        // ...and so on...
    }
}

但是,如果你完全信任数据,你可以使用eval

function compare(operator, operand1, operand2) {
    return eval("operand1 " + operator + " operand2");
}

(看起来像伪代码,但它不是; eval会在您调用它的上下文中评估您提供的代码字符串,因此它可以访问operand1和{ {1}}参数。)

“信任”部分确实非常重要,因为operand2允许执行任何脚本代码。如果您允许Bob提供最终将由Alice在浏览器中评估的数据,不要使用eval。这对Alice来说是一个重大的安全风险。

答案 2 :(得分:0)

更好的方法是编写自己的SQLiteDatabase db = dbHelper.getWritableDatabase(); db.beginTransaction(); try { for (...) { ... dbHelper.insertChannels() ... } db.setTransactionSuccessful(); } finally { db.endTransaction(); } 方法并将结果/代码保存在DB上

compare

然后在db上保留function compare(a, b): if( a < b ) return -2; else if (a <= b) return -1; else if ( a == b) return 0; //... 0-1的值

现在,如果你想从你的数据库中应用一些比较器,你只需在你的字符串上调用-2并检查结果是否与来自数据库的代码相同(它会给你 True 错误

这里唯一的问题是你需要对数据集进行所有比较,但它是完全安全的,并且还会处理一些不合适的操作符(不能应用于字符串) - 唯一的要求是DB上的代码必须是键

答案 3 :(得分:0)

您可以使用eval功能

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

var a = 10;
var b = 20;
var comparator = '<=';
var result = eval(a + comparator + b)
// true

答案 4 :(得分:0)

您可以使用jquery ajax调用从服务器端代码检索字符串运算符,然后在javascript代码中评估字符串以进行比较。

<script>
$(document).ready(function(){
    $.ajax({url: "retrieveOperator.php", success: function(result){

    switch(String(result)) {
        case "==":
            code block for == operator
            break;
        case ">=":
            code block for >= operator
            break;
        default:
            default code block
    }   
    });
});
</script>