javascript - 在 Javascript 中评估表达式树

标签 javascript recursion expression-trees

我的输入由嵌套的逻辑表达式对象组成
前任:

var obj = {
  'OR': [
      {
        'AND': [
            false, true, true
        ]
      },
      {
        'OR': [
            true, false, false, {
                'AND': [true, true]
            }
        ]
      },
      true
  ]
};
相当于((false && true && true) || (true || false || false || (true && true)) || true)我们需要编写一个函数来计算这个
方法:
进入最内层并先评估它,移动到顶部
var expressionEvaluator = function(opArr){
            var hasChildObjects = function(arr){
                if(Array.isArray(arr)){
                    return arr.some(function(obj){
                        return typeof(obj) === 'object';
                    });
                }
                else if(typeof(arr) === 'object'){
                    return true;
                }
            };
            var evaluateArr = function(list, operator){
                var result;
                if(operator === 'AND'){
                    result = true;
                    for(var i = 0; i<list.length; i++){
                        if(!list[i]){
                            result = false;
                        }
                    }
                }
                else if(operator === 'OR'){
                    result = false;
                    for(var i = 0; i<list.length; i++){
                        if(list[i]){
                            result = true;
                        }
                    }
                }
                return result;
            };
            var iterate = function(opArr){
                Object.keys(opArr).forEach(function(k){
                    if(hasChildObjects(opArr[k])){
                        iterate(opArr[k]);
                    }
                    else{
                        opArr = evaluateArr(opArr[k], k);
                    }
                });
            };
            iterate(opArr);
            return result;
        }
我能够到达最里面的对象并对其进行评估,但不能回到最顶层并评估整个表达式对象。

最佳答案

您可以使用简单的递归函数。

  • 如果当前对象有 OR键,然后检查 some 数组中的项目是 truthy .
  • 如果 AND , 检查是否 every 项目是 truthy .
  • 如果数组中的一项是对象,则递归调用对象上的函数以获取其值

  • const input={OR:[{AND:[false,true,true]},{OR:[true,false,false,{AND:[true,true]}]},true]};
    
    function evaluate({ OR, AND }) {
      if (OR)
        return OR.some(c => typeof c === 'object' ? evaluate(c) : c)
      if (AND)
        return AND.every(c => typeof c === 'object' ? evaluate(c) : c)
    }
    
    console.log(evaluate(input))

    由于回调函数相同,您还可以获取对变量的操作并动态调用它:
    function evaluate({ OR, AND }) {
      const array = OR ?? AND,
            operation = OR ? 'some' : 'every';
      
      return array[operation](c => typeof c === 'object' ? evaluate(c) : c)
    }
    
    或者
    const evaluate = ({ OR, AND }) => OR ? OR.some(callback) : AND.every(callback),
          callback = c => typeof c === 'object' ? evaluate(c) : c
    

    关于javascript - 在 Javascript 中评估表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65211902/

    相关文章:

    dynamic - 什么是绑定(bind)限制?

    c# - 使用已编译的 Lambda 表达式而不是 Activator.CreateInstance 来初始化 SoapHttpClientProtocol 对象

    javascript - 在 WebGL + JavaScript 中更改颜色

    递归函数中的 JavaScript promise

    python - 使用递归从长度为 n 的列表中计算长度为 k 的组合

    javascript - Ember - 嵌套递归模块

    c# - 'Data Structure' 和 'compiled code' 有什么区别

    javascript - node-http-proxy,如何将新的查询参数传递给初始请求?

    javascript - 如何使用 javascript 更改复杂的 CSS 节点属性?

    javascript - 将 json 文件从 php 打印到 javascript