这里有一个不寻常的问题,也许我正在错误地解决这个问题 -
我想在Javascript中对某些数值进行比较,但我将比较器存储在数据库中(在VARCHAR字段中),其中存储了特定的标准。 (比较器为< =,<,==,>,> =等)。
有没有办法评估在JS中作为比较器返回的字符串?
由于
答案 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>