Javascript 如何编译和计算对象上指定的逻辑运算符和操作数?
有没有编译器或简单的方法可以编译和计算对象上指定的逻辑运算符和操作数。这类似于mongodb和operators。例如:Javascript 如何编译和计算对象上指定的逻辑运算符和操作数?,javascript,parsing,ecmascript-6,boolean-logic,Javascript,Parsing,Ecmascript 6,Boolean Logic,有没有编译器或简单的方法可以编译和计算对象上指定的逻辑运算符和操作数。这类似于mongodb和operators。例如: return { $or: [ foo: [...], bar: [...] ] } 当编译器遇到foo时,它将使用为其提供的值调用相应的函数。这同样适用于条。然后它将逻辑或两个操作的结果。我想处理$和以及$或运算符。我会对这样一个简单的示例进行简单的检查,但我希望能够嵌套逻辑运算符。一个复杂的例子: return { $or: [ {
return {
$or: [
foo: [...],
bar: [...]
]
}
当编译器遇到foo
时,它将使用为其提供的值调用相应的函数。这同样适用于条
。然后它将逻辑或两个操作的结果。我想处理$和
以及$或
运算符。我会对这样一个简单的示例进行简单的检查,但我希望能够嵌套逻辑运算符。一个复杂的例子:
return {
$or: [
{
$and: [
{ foo: [...] },
{ bar: [...] }
]
},
{ baz: [...] },
() => m < n
]
}
样本数据:
设置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.
您可以采取类似的方式,区分$和
与$或
或函数
它的工作原理是获取一个对象,该对象带有数组方法的键,例如,它的作用类似于逻辑函数,并测试对象中的值,如果所有回调项都返回值,则返回true
。类似的方法也可以工作,但回调只需要一个返回真实值的项
另一个对象包含函数并允许使用键访问它们
第一个PAR检查参数是否为函数,如果是,则返回调用的结果。
然后对参数进行检查,如果像
null
或如果该值不是对象,则函数终止为false
对于获取键/值对,将使用来自对象的第一个条目执行
如果操作符对象中有键
,则将该值作为迭代值
的方法并返回
如果key
在functions对象中,则调用函数时使用value
作为参数并返回
最后返回一个false
,因为没有其他检查为true,并且无法解决该问题
函数求值(对象){
var运算符={$or:'some',$and:'every'},
fns={
foo:items=>items.indexOf(“foo”)>=0,
条形图:items=>items.indexOf(“条形图”)>=0,
baz:items=>items.indexOf(“baz”)>=0
},
钥匙
价值
if(typeof object==='function')返回object();
如果(!object | | typeof object!=“object”)返回false;
[key,value]=Object.entries(Object)[0];
if(输入运算符)返回值[运算符[输入]](评估);
如果(输入fns)返回fns[键](值);
返回false;
}
var m=4,
n=1,
对象={
$or:[
{
美元及:[
{foo:['foo',x']},
{bar:['bar',y']}
]
},
{baz:['baz','z']},
()=>m 控制台日志(结果)代码>请添加一些数据以及想要的结果。您为foo
或bar
的项目调用哪个函数?数组的内容是什么?不,没有编译器。但是,您可以通过(递归地)枚举对象并在遇到此类键时调用函数来轻松实现这一点。你试过什么吗?我还没试过。我认为在试图重新发明轮子之前寻求帮助会更好。@MutaiMwiti不,你不是在重新发明轮子,或者至少没有什么比轮子更基本的东西。我怀疑是否有一个库可以完全满足您的需求,即使当时有人要求提供一个库,也与StackOverflow无关。请告诉我们您的尝试,解决方案是相当简单的递归函数。这个答案很有效。你介意把它分解一下吗?请解释一下这行:if(输入操作符)返回值[operators[key]](evaluate)代码>。它检查键
,如$或是否在对象运算符
中,如果它是真的
,则使用运算符
的键
调用数组值
,如一些
或每个
,并回调函数求值
。嵌套对象被移交给函数,结果true
/false
被用作量词。
m = 1; n = 3; foo: ['x']; bar: ['y']; baz: ['x']
RESULT = true; // because m < n.
m = 3; n = 1; foo: ['x']; bar: ['bar']; baz: ['z']
RESULT = true; // because m > n, baz() is false and x and $and is false.