[英]Evaluate simple condition programmatically in javascript
我有一個簡單對象的列表:
const conditions = [
{value: true, op: "AND"},
{value: true, op: "AND"},
{value: false, op: "OR"},
{value: true, op: null},
]
我怎樣才能有效地減少和解決這種情況,所以我最終得到一個“真”?
我試過愚蠢地迭代它們並創建新列表,然后再次處理並非常接近,但我無法讓它以這種方式工作,而且很可能有一種更有效的方法,只有一個循環或遞歸function 調用,但我現在無法讓它工作......
感謝任何輸入
編輯:我能夠找到一個似乎可行的解決方案。 但是,它不是很有效,因為它總是處理所有列表條目,因為 boolean 邏輯可能提前退出:
const check = (results) => {
return results.reduce((prev, cur) => {
if (prev.op === "AND") {
return {value: prev.value && cur.value, op: cur.op};
}
return {value: prev.value || cur.value, op: cur.op};
}).value;
}
仍然對更有效的方法感興趣
編輯 2:我發現這種 reduce 方法不起作用的情況。 我求助於使用簡單的循環。 使用字符串作為輸入使評估更容易:
const checkWithLoops = (test) => {
const andPairs = test.split("or");
const andResults = [];
for (let i = 0; i < andPairs.length; i++) {
const vals = andPairs[i].split(" ");
let andRes = true;
for (let o = 0; o < vals.length; o++) {
if (vals[o] === "false") {
andRes = false;
}
}
andResults.push(andRes);
}
let orResult = false;
for (let i = 0; i < andResults.length; i++) {
if (andResults[i] === true) {
orResult = true;
break;
}
}
return orResult;
};
當前的conditions
形式有點奇怪,在此之前您很有可能會從改進程序中受益。 並且reduce
不是一個很好的選擇,因為即使可以更早地確定解決方案,它也會遍歷整個conditions
數組。 但是,當前形式的一種解決方案是編寫一個簡單的遞歸eval
-
function eval(t = []) { if (t.length == 0) return undefined else switch (t[0].op) { case "AND": return t[0].value && eval(t.slice(1)) case "OR": return t[0].value || eval(t.slice(1)) default: return t[0].value } } const conditions = [ {value: true, op: "AND"}, {value: true, op: "AND"}, {value: false, op: "OR"}, {value: true, op: null}, ] console.log(eval(conditions)) // true && (true && (false || true)) // true && (true && true) // true && true // true
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.