javascript - Js - 使用运算符作为字符串评估数学表达式的替代方法

标签 javascript node.js typescript eval

<分区>

我有一个库,它具有根据某些字段过滤对象的功能(每个字段都有特定类型 - 更多信息请参见 https://github.com/jy95/mediaScan/wiki)

最大的问题是处理来自多个来源的数字属性

// to handle number operations
export interface NumberExpressionObject {
    operator: "==" | ">" | "<" | ">=" | "<=";
    number: number;
}

// additional Properties
export interface AdditionalProperties {
    type: AdditionalPropertiesType;
    name: string;
    value: boolean | string | string[] | number | NumberSearchSyntax;
}

例如:

expect((libInstance.filterTvSeries({
            additionalProperties: [
                {type: "number", name: "whateverFieldThatDoesn'tExist", value: "<50"},
                {type: "number", name: "AnotherField", value: undefined},
                {type: "number", name: "AnotherField2", value: "<=25"},
                {type: "number", name: "AnotherField3", value: ">25"},
                {type: "number", name: "AnotherField4", value: "==25"},
            ],
            season: ">=4",
        }))).toEqual(
            new Map(),
        );

每个必须首先对应以下正则表达式:

const validExpression = /^(==|>|<|>=|<=)(\d+)$/;

然后将被这个函数评估:

function resolveExpression(property: string,
                           expressionObject: MediaScanTypes.NumberExpressionObject,
                           object: MediaScanTypes.TPN | MediaScanTypes.TPN_Extended): boolean {
    return eval(`${object[property]}${expressionObject.operator}${expressionObject.number}`);
}

我想知道有什么更简洁的方法来做到这一点......请避免像 switch case 这样简单的答案:我测试了它但它在我的测试中仍然比 eval 慢......

函数构造函数对我来说和 eval 是一样的..

我读过的以前的帖子:
Evaluating a string as a mathematical expression in JavaScript
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function
...

最佳答案

  1. 为运算符实现函数

    运算 = { '>': (a, b) => a > b, '>=': (a, b) => a >= b };

    ops[expressionObject.operator](object[property], expressionObject.number)

  2. 如果表达式始终按预期有效。然后跟随应该更快,因为没有解析。

    eval(${object[property]}${expression})

关于javascript - Js - 使用运算符作为字符串评估数学表达式的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49744053/

相关文章:

javascript - 当一个按钮被选中而其他按钮未被选中时,如何制作一个按钮组 Javascript

javascript - 使用 Node.js 子进程时没有回车?

javascript - 按两个元素和总和值对数组对象进行分组(Javascript)

mysql - 如何从 var require 导入函数值?

typescript - 如何在智能感知的 Monaco Editor 中定义全局变量?

node.js - 使用 typescript 和 Node 热重载

JavaScript 不会运行第二次

javascript - 在 dragenter 事件期间获取文件名

javascript - 如何在没有 jQuery 的情况下隐藏和显示数组元素

node.js - 两级嵌套 Mongoose 模式