创建布尔值、数组和来自数组的对象的嵌套对象



我正在尝试创建一个对象来满足json逻辑js所需的结构。下面提供了该结构的示例。

源阵列由booleansstrings组成。字符串只能是ORANDNANDNOR。目前我只使用ORAND

布尔值和字符串的数组可能如下所示。这些值是动态的。因此布尔值可以是true或false,也可以是上面提到的字符串。

const source = [false, "OR", false, "OR", false, "AND", false, "AND", false, "OR", true]

如果这个源数组在if语句中,我相信它的分组如下:

(false || false || (false && false && false) || true) // true

我希望输出以下对象,以满足json逻辑jsJS包:

const result = {
'or': [
false,
false,
{
'and': [
false,
false,
false,
]
},
true,
]
}

我尝试过递归函数,并一直在使用.reduce((方法,但至今仍无法找到解决方案。在对源数组进行迭代时,我很难创建对象。我在SO上搜索过类似的答案,但似乎没有人想要和我一样的结果对象结构

尝试以下解决方案。希望代码或多或少是不言自明的:

function process(arr) {
const isBool = (x) => x === true || x === false;
const prec = (x) => -["AND", "OR"].indexOf(x);
// Convert infix -> postfix
const postfix = [];
const ops = [];
for (const x of arr) {
if (!isBool(x)) {
const prev = ops[ops.length - 1];
if (prev === undefined || prec(x) > prec(prev)) {
ops.push(x);
} else {
while (ops.length > 0 && prec(x) < prec(ops[ops.length - 1])) {
postfix.push(ops.pop());
}
ops.push(x);
}
} else {
postfix.push(x);
}
}
postfix.push(...ops.reverse());
// Convert postfix -> output format
const stack = [];
for (const x of postfix) {
if (!isBool(x)) {
const op = x.toLowerCase();
const prevs = [stack.pop(), stack.pop()];
const obj = prevs.find((y) => !isBool(y) && y.hasOwnProperty(op));
if (obj !== undefined) {
const other = prevs.find((y) => y !== obj);
obj[op].push(other);
stack.push(obj);
} else {
stack.push({
[op]: prevs,
});
}
} else {
stack.push(x);
}
}
return stack[0];
}
console.log(JSON.stringify(process([false, "OR", false, "OR", false, "AND", false, "AND", false, "OR", true]), null, 2));

最新更新