javascript - 将字符串解析为 javaScript 中的条件?

标签 javascript parsing

我有一个包含一些条件的字符串,例如:

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/

相关文章:

javascript - 隐藏 iframe 的内容高度

java - 解析包含分隔符的字符串

java - Java 中如何在字符串中引发 int 值?

javascript - 如何使用正则表达式在 javascript 中通过 id 获取元素?

javascript - 图表 js 大小和位置

javascript - JSON.parse 应该是递归的吗?

Java org.w3c.dom : is there a Java parser library?

python - 在渲染模板中将变量从 python (flask) 传递到 HTML?

javascript - 新日期 ('2011-12-15 00:00:00' ) 显示为 NaN

javascript - 防止阻止使用 Facebook SDK 出现的弹出窗口