是否有编译器或简单的方法可以编译和评估对象上指定的逻辑运算符和操作数。这类似于 mongodb $or和 $and运营商。例如:
return {
$or: [
foo: [...],
bar: [...]
]
}
当编译器遇到foo
时,它会调用相应的函数,并为其提供相应的值。 bar
也是如此。然后它将对这两个操作的结果进行逻辑或
。我想处理 $and
和 $or
运算符。我会为这样一个简单的例子做简单的检查,但我希望能够嵌套逻辑运算符。一个复杂的例子:
return {
$or: [
{
$and: [
{ foo: [...] },
{ bar: [...] }
]
},
{ baz: [...] },
() => m < n
]
}
foo
、bar
和baz
的简化定义:
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/