簡體   English   中英

在 javascript 中以編程方式評估簡單條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM