javascript 递归求解JSON中的术语,具有N种可能性

vybvopom  于 2022-12-10  发布在  Java
关注(0)|答案(1)|浏览(115)

我有一个JSON输入,它的结构如下:

const logicJson2 = [
        [
            { "key": true  },
            "OR",
            { "key": true  }
        ],
        "AND",
        [
            { "key": false},
            "OR",
            { "key": true  }
        ]
]

这是一个例子,输入可能更复杂,例如:

const logicJson = [
            [
                  [
                    { "key": false  },
                    "AND",
                    { "key": true  }
                  ],
                  "OR",
                  { "key": true  }
            ],
            "AND",
            [
                { "key": false},
                "OR",
                { "key": true  }
            ]
    ]

我想到了用递归的方法来开始求解它。所以,如果输入项是一个数组,我就把它递归地传递给函数。这是我开始工作的一个非常简单的例子:

const store = new Map();
function analyze(term){
  if(Array.isArray(term[0])){
      store.set("first",{first: analyze(term[0])});
  }else{
      store.set("first",{first: term[0].key});
  }
  if(Array.isArray(term[2])){
    store.set("second",{second: analyze(term[2])});
  }else{
      store.set("second",{second: term[2].key});
  }

  if(store['first'] && store['second']){
    switch(term[1]){
      case 'AND':
        return term[0].key && term[2].key
        break;
      case 'OR':
        return term[0].key || term[2].key
        break;
    }
  }
}

我被困在那里,我应该如何处理这个问题,什么是最有效的方法?。应该从最后存储结果,并开始解决每一项,直到我得到最终结果?,这必须是真或假取决于逻辑。有一个例子或模式在那里我应该参考?。非常感谢

jv4diomz

jv4diomz1#

因为在同一个函数执行过程中需要存储值,所以不需要使用Map,所以可以只使用局部变量来存储递归调用的返回值。其次,可以通过检查参数本身的类型来简化,而不是检查索引0和索引2处的条目。这样可以避免代码重复(对于左操作数和右操作数)。
以下是具体的操作方法:

const operators = {
    "OR": (a, b) => a || b,
    "AND": (a, b) => a && b
};

function evaluate(expression) {
    if ("key" in expression) return expression.key; // base case
    const [left, operator, right] = expression;
    return operators[operator](evaluate(left), evaluate(right));
}

// Demo
const expression = [
    [
        [{ "key": false  }, "AND", { "key": true  }],
        "OR",
        { "key": true  }
    ],
    "AND",
    [
        { "key": false},
        "OR",
        { "key": true  }
    ]
];

console.log(evaluate(expression));

相关问题