我有一个包含一些条件的字符串,例如:
var str = "this.demoModel.active == '1' && this.demoModel.span > 5 || ..."
在 javascript 中是否有一种直接的方法来解析它们,以便它们像一组条件一样工作。像这样的东西:
if (JSON.parse(str) {})
。 ??
最佳答案
一般来说,你应该尽量避免陷入这种情况:如果可能的话,应该避免将 JavaScript 存储在字符串中以供以后评估。根据您的实际情况,您可以考虑以下选项:
1。使用模板文字:
它们在实际使用中受到限制,因为它们与使用它们的脚本一起被解析,但是 they are also safe :
var str = `${this.demoModel.active == '1' && this.demoModel.span > 5}`;
当这个字符串被赋值时,它会立即计算其中的 ${ }
部分。
因此,如果评估可以立即发生,这只是一个解决方案,因为您不能将其存储在字符串中,然后期望稍后触发评估。
因此它与以下内容没有太大区别:
var bool = this.demoModel.active == '1' && this.demoModel.span > 5;
2。通过回调延迟评估
解决方法是定义一个计算模板文字或表达式的函数,如下所示:
var rule = function() {
return this.demoModel.active == '1' && this.demoModel.span > 5;
};
...您可以传递该函数,例如作为回调:
doSomething(rule);
... 然后 doSomething 可以像这样调用它,绑定(bind)上下文,以便 this
具有适当的值:
function doSomething(rule) {
if (rule.call(this)) console.log('rule passed');
}
3。嵌套对象数据结构
另一种选择是为表达式创建对象结构,例如:
var rules = [
[{ // AND conditions:
"field": "active",
"compare": "eq",
"target": 1
}, {
"field": "span",
"compare": "gt",
"target": 5
}], // Next array will be OR'ed
[{
"field": "...."
"compare": "..",
"target": ...
}]
}];
这是一个嵌套数组,其中顶层的规则必须一起进行“或”运算,而内层将进行“与”运算。
然后编写一个函数来处理这个结构。 compare 名称可以映射到代码中的函数,如下所示:
const comparators = {
"eq": (a, b) = a === b,
"gt": (a, b) = a > b
};
因此,要计算rules 数组中的一个对象,您可以使用:
execute: (obj) => comparators[this.demoModel[obj.compare]] // get the function
(this.demoModel[obj.field], obj.target) // pass arguments
这个规则结构可以很容易地作为 JSON 字符串保存和加载。
关于javascript - 将字符串解析为 javaScript 中的条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43203140/