javascript - 如何编译和评估对象上指定的逻辑运算符和操作数?

标签 javascript parsing ecmascript-6 boolean-logic

是否有编译器或简单的方法可以编译和评估对象上指定的逻辑运算符和操作数。这类似于 mongodb $or$and运营商。例如:

return {
  $or: [
    foo: [...],
    bar: [...]
  ]
}

当编译器遇到foo 时,它会调用相应的函数,并为其提供相应的值。 bar 也是如此。然后它将对这两个操作的结果进行逻辑或。我想处理 $and$or 运算符。我会为这样一个简单的例子做简单的检查,但我希望能够嵌套逻辑运算符。一个复杂的例子:

return {
  $or: [
    { 
      $and: [
        { foo: [...] }, 
        { bar: [...] }
      ] 
    }, 
    { baz: [...] }, 
    () => m < n
  ]
}

foobarbaz 的简化定义:

export const evalFoo = items => {
  return items.indexOf("foo") >= 0;
};

export const evalBar = items => {
  return items.indexOf("bar") >= 0;
};

export const evalBaz = items => {
  return items.indexOf("baz") >= 0;
};

示例数据:

第 1 组

m = 4; n = 1; foo: ['foo', 'x']; bar: ['bar', 'y']; baz: ['baz', 'z']

RESULT = true; // because $and results to true.

第 2 组

m = 4; n = 1; foo: ['x']; bar: ['y']; baz: ['x']

RESULT = false; // because m > n and $and results to false.

第 3 组

m = 1; n = 3; foo: ['x']; bar: ['y']; baz: ['x']

RESULT = true; // because m < n.

第 4 组

m = 3; n = 1; foo: ['x']; bar: ['bar']; baz: ['z']

RESULT = true; // because m > n, baz() is false and x and $and is false.

最佳答案

你可以采取类似这样的方式,在其中区分 $and$or 或函数。

它的工作原理是获取一个带有数组方法键的对象,如 Array#every ,这就像一个逻辑和通过测试对象中的值并返回 true 如果所有项目及其回调返回 truthy值(value)。类似作品Array#some , 但只有一项是必需的,回调返回一个真值。

另一个对象包含函数并允许使用 key 访问它们。

第一个 par 检查参数是否为函数,如果是,则返回调用结果。

然后参数得到检查,如果falsy ,如 null 或如果该值不是对象,则函数以 false 终止。

用于获取键/值对 a destructuring assignment发生在对象的第一个条目上。

如果key在operator对象中,则将value作为迭代value的方法返回。

如果 key 在函数对象中,则函数以 value 作为参数调用并返回。

最后返回一个false,因为没有其他检查为真,条件无法解决。

function evaluate(object) {
    var operators = { $or: 'some', $and: 'every' },
        fns = {
            foo: items => items.indexOf("foo") >= 0,
            bar: items => items.indexOf("bar") >= 0,
            baz: items => items.indexOf("baz") >= 0
        },
        key,
        value;

    if (typeof object === 'function') return object();
    if (!object || typeof object !== 'object') return false;

    [key, value] = Object.entries(object)[0];

    if (key in operators) return value[operators[key]](evaluate);
    if (key in fns) return fns[key](value);
    return false;
}

var m = 4,
    n = 1,
    object = {
        $or: [
            {
                $and: [
                    { foo: ['foo', 'x'] },
                    { bar: ['bar', 'y'] }
                ]
            },
            { baz: ['baz', 'z'] },
            () => m < n
        ]
    },
    result = evaluate(object);

console.log(result);

关于javascript - 如何编译和评估对象上指定的逻辑运算符和操作数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55240828/

相关文章:

javascript - 这个正则表达式如何实现从大写到小写的交换,反之亦然?

javascript - jQuery - 如何检测剪贴板内容是否已更改?

parsing - 将 C 类型语法编译为自定义程序集

blackberry - 解析黑莓 .ipd 文件

python - 获取 element.tagName 的问题。使用 Python 和 xml.dom.minidom 解析 XML

arrays - ES6 : Merge two arrays into an array of objects

node.js - 当前 javascript 版本不支持字符串模板

javascript - 在浏览器中打开 index.html 时,jQuery 代码不会运行。控制台没有错误

javascript - 渲染后无法更新表的数据

javascript - javascript 中的验证 - 删除焦点上的错误消息