JavaScript字符串布尔比较器

3

这里有一个不太寻常的问题,也许我在解决这个问题的方法上存在问题 -

我想在Javascript中比较一些数字值,但是我将比较器存储在数据库中(在一个VARCHAR字段中),其中存储了特定的条件。 (比较器包括<=,<,==,>,>=等)。

有没有一种方法可以在JS中评估作为比较器返回的字符串?

谢谢


1
eval 函数。在此处阅读相关信息:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/eval - Ajay Narain Mathur
如果您正在比较字符串,它只会比较第一个字符,如果相同,则比较第二个字符,以此类推。如果您想比较数值,请使用 parseInt - Kevin Kloet
类似于 switch(cmp) case '<=': ... 这样的写法是您最明智的选择。 - deceze
我已经实现了switch()解决方案,但是我想在这里扩展问题,以便可能找到更“纯粹”的解决方案。建议使用eval()函数+1。谢谢大家。 - jarodsmk
5个回答

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);

谢谢Nina,我正在考虑做类似的事情 - 但是想知道是否有更深入的方法来将字符串评估为布尔比较器? - jarodsmk
这要看情况。你有例子吗? - Nina Scholz
看了上面TJ的回答,eval()函数会执行代码,无论它是否可信。在我看来,我试图找到类似于将字符串转换为布尔值的东西,但是作为比较器/运算符。 - jarodsmk
@N15M0_jk:Nina的映射对象非常接近这个。它基本上让你获得一个等价于运算符的函数。我可能会将该映射封装在一个函数中:function getOperator(opname) { return comparison[opname] || comparison.default; } 然后使用它:var op = getOperator(">="); if (op(operand1, operand2)) { ... } 它非常像我的带有switchcompare函数,但是反过来,将每个运算符封装为一个函数。这很有道理;在计算机科学水平上,运算符就是函数,只是具有更方便的表示法。 - T.J. Crowder

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`和`operand2`参数。)“信任”这部分非常重要,因为`eval`允许执行任何脚本代码。如果您允许Bob提供最终将由Alice在浏览器中评估的数据,请不要使用`eval`。这对Alice构成严重的安全风险。)

谢谢TJ,我正在寻找这样的东西 :) 就您提供的比较函数代码示例而言,由于文字字面值的位置,操作数1和操作数2不会完全评估为字符串吗? - jarodsmk
@N15M0_jk:不,它们(在上面的代码中)没有被转换为字符串。当它们传递给“compare”函数时,它们保留它们本来的类型。 - T.J. Crowder

0
更好的方法是编写自己的compare方法,并将结果/代码保存在数据库中,例如:
function compare(a, b):
    if( a < b ) return -2;
    else if (a <= b) return -1; 
    else if ( a == b) return 0;
    //...

然后在数据库中保留0-1-2的值

现在,如果您想要从您的数据库应用某些比较器,您只需调用compare函数并检查结果是否与数据库中的代码相同(它将给您TrueFalse

唯一的问题是您需要对数据集进行所有比较,但这完全安全,并且还将处理一些不适当的运算符(不能应用于字符串)- 唯一的要求是DB上的代码必须是一个键


0

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接