这里有一个不太寻常的问题,也许我在解决这个问题的方法上存在问题 -
我想在Javascript中比较一些数字值,但是我将比较器存储在数据库中(在一个VARCHAR字段中),其中存储了特定的条件。 (比较器包括<=,<,==,>,>=等)。
有没有一种方法可以在JS中评估作为比较器返回的字符串?
谢谢
这里有一个不太寻常的问题,也许我在解决这个问题的方法上存在问题 -
我想在Javascript中比较一些数字值,但是我将比较器存储在数据库中(在一个VARCHAR字段中),其中存储了特定的条件。 (比较器包括<=,<,==,>,>=等)。
有没有一种方法可以在JS中评估作为比较器返回的字符串?
谢谢
是的,您可以使用一个对象作为比较器的键,并返回一个用于进行比较的函数。
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);
function getOperator(opname) { return comparison[opname] || comparison.default; }
然后使用它:var op = getOperator(">="); if (op(operand1, operand2)) { ... }
它非常像我的带有switch
的compare
函数,但是反过来,将每个运算符封装为一个函数。这很有道理;在计算机科学水平上,运算符就是函数,只是具有更方便的表示法。 - T.J. Crowder有这个功能,但是除非你在使用完全可信数据,否则不要使用它。
相反地,请实现比较:
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");
}
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
函数并检查结果是否与数据库中的代码相同(它将给您True或False)
唯一的问题是您需要对数据集进行所有比较,但这完全安全,并且还将处理一些不适当的运算符(不能应用于字符串)- 唯一的要求是DB上的代码必须是一个键
您可以使用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
<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>
eval
函数。在此处阅读相关信息:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/eval - Ajay Narain Mathurswitch(cmp) case '<=': ...
这样的写法是您最明智的选择。 - deceze