2017-05-31 158 views
10

這裏是代碼的一些樣品線..如何優化大量的if-else if-else語句表達

if(loc > 0 || cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built) {  
/// Condition to checn all true 
    return true; 
} else if(loc < 0 || cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built) { 
    /////// 1 false other are true 

} else if(loc > 0 || cat < 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built) { 

} 

如何處理這些情況。 如果我有5個聲明。那麼它一定是幾乎12 +條件一個接一個..如果我檢查所有的5個組合,它會去更多的代碼行我們有更好的選擇來檢查所有的條件。

+5

從上面的3你重複最後3次檢查,你可以檢查一次,並嵌套if語句,如果餘下的話。 –

+0

所以你想要有一個if-elseif-else分支以及這些變量的所有可能性? '價格> 0 || jsBed <=臥室|| jsBuilt> = built'似乎重複。不確定是否要檢查例如'jsBed>臥室'? – KarelG

+1

你是否想要找到符合條件的總數? (第二和第三條件應該被視爲相同)?或者你有不同的實現取決於滿足哪種條件? –

回答

12

如果你把一個布爾表達式,如JavaScript的一個整數,它會評估爲0(爲false)或1(用於true)。所以,你可以總結的條件,然後使用switch-case結構來檢查有多少是真實的:

var numTrue = 
    (loc > 0) + (cat > 0) + (price > 0) + (jsBed <= bedroom) + (jsBuilt >= built); 

switch(numTrue) { 
    case 0: 
     // do something if no condition is met 
     break; 
    case 1: 
     // do something else if one condition is met 
     break; 
    // etc... 
} 
+1

這看起來很合理..我正在考慮它..謝謝@Mureinik –

+0

@MArfan根據給定的信息,這是一個最好的解決方案,但如果還有其他組合,請將它們添加到問題中。可以有其他方法可以幫助。 – Rajesh

+6

因此,loc = 0,cat = 1被視爲loc = 1,cat = 0。這並不解決OP的例子。它只檢查符合條件的總數。 –

0

由於您的3個條件是固定的,你可以先有他們,其次是他人,這可以轉換成切換情況。

if(price > 0 || jsBed <= bedroom || jsBuilt >= built) { 
    var locCheck = (loc > 0) ? 1 : 0; 
    var catCheck = (cat > 0) ? 1 : 0; 
    switch(locCheck + catCheck){ 
     case 0: 
      break; 
     case 1: 
      break; 
     case 2: 
      break; 
     default: 
      break; 
    } 
} 
+0

'(loc> 0)? 1:0'可以替換爲'+(loc> 0)'。同樣,由於OP有多個OR條件,即使最後3個條件爲假,代碼也必須執行。您的代碼將無效 – Rajesh

+0

我不理解它。試圖瞭解.. –

+0

這不等同於OP的代碼。如果'價格> 0 || jsBed <=臥室||當'loc'&'cat'是正數時,jsBuilt> = built'就是'false',代碼根本不會執行。在OP代碼中,首先執行if語句體。 – Tushar

1

edit1:修改爲javascript,而不是java。糟糕...

我不確定您是否想查看所有組合,但可以通過爲每個可能的輸出引入一個數值來對它們進行分組。

具體而言,每個變量有5個變量和2個選項?我用二進制表示設置了一個包含數字的表格。如果每個(或某個)變量都有2個選項,則必須使用數字(基數10)。您可以使用二進制值像

const locVal = (loc > 0 ? 0x1 : 0x0) << 0; 
const catVal = (cat < 0 ? 0x1 : 0x0) << 1; 
const priceVal= (price < 0 ? 0x1 : 0x0) << 2; 
ect 

所以,你可以將它們的方法:

function foo(trueCond, level) { 
    return (trueCond ? 0b1 : 0b0) << level; 
} 

這使得

const locVal = foo(loc > 0, 0); 
const catVal = foo(cat > 0, 1); 
const priceVal= foo(price > 0, 2) 

(我省略了其他瓦爾...)然後加起來的二進制值

const total = locVal + catVal + priceVal 

然後,你現在在case使用開關case語句等

switch (total) { 
    case 0: // all options negative 
    case 1: // only loc is positive 
    case 2: // only cat is positive 
    case 3: // both loc and cat is positive 
    ect 
} 

的值表示存在於total二進制序列的整數值。需要注意的是,對於文檔代碼非常好,特別是大小寫塊,這樣其他讀者可以直接計算出哪個值代表什麼(就像我做過的那樣),這一點非常重要。

如果每個可變多於兩個選項中,可以在10因子工作(如在方法FOO中,使用(trueCond ? 1 : 0) * Math.pow(10, level)

+3

這不是Java的問題。 – user694733

2

5個條件是2 ** 5,即32種組合。

如果您想要檢查各種組合,而無需重複測試,則可以對各個結果進行位移,並將它們組合在一起以作爲switch語句。 與數字直接合作簡潔,但不是很可讀

var loc=1,cat=0,price=0,jsBed=1,bedroom=0,jsbuilt=0,built=1; 
 

 
let results=[loc > 0,cat > 0,price > 0,jsBed <= bedroom,jsbuilt >= built]; 
 
let bits=results.reduce((accum,current,index)=>accum+(current<<index), 0); 
 
switch(bits){ 
 
case 0: // none 
 
break; 
 
case 3: // first two 
 
break; 
 
case 4: // third one 
 
break; 
 
}

修改此使用常量會使switch語句更易讀

var loc=0,cat=1,price=0,jsBed=1,bedroom=0,jsbuilt=0,built=1; 
 

 
const locBit=1<<0; 
 
const catBit=1<<1; 
 
const priceBit=1<<2; 
 
const bedBit=1<<3; 
 
const builtBit=1<<4; 
 
let bits=(loc > 0)*locBit | 
 
     (cat > 0)*catBit | 
 
     (price > 0)*priceBit | 
 
     (jsBed <= bedroom)*bedBit | 
 
     (jsbuilt >= built)*builtBit; 
 
switch(bits){ 
 
    case 0: 
 
     console.log("!loc,!cat,!price,!bed,!built"); 
 
     break; 
 
    case catBit|locBit: 
 
     console.log("loc,cat,!price,!bed>!built"); 
 
     break; 
 
    default: 
 
     console.log(bits); 
 
}

你可以使用con stants幫助

4

你必須條件,將永遠不會得到滿足:

if(loc > 0 || cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built){  
    /// Condition to checn all true 
    return true; 
} else if(loc < 0 || cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built) { 
/////// 1 false other are true 

} else if(loc > 0 || cat < 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built) { 

} 

基本上是:

  • 在第二否則如果,條件cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built是第一個已經見過沒用ebcause。由於您使用的是else if,因此他們已經輸入了第一個if。所以唯一重要的是loc < 0
  • 同上elseif只有cat < 0是相關的。

所以可以重寫,以

if(loc > 0 || cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built){  
    /// Condition to checn all true 
    return true; 
} else if(loc < 0) { 
/////// 1 false other are true 

} else if(cat < 0) { 

} 

這個回答假設提供的代碼是你試圖簡化一個,而不是一個通用的樣品。

注意:我想你可能沒有寫你想做的事,忘了一些AND而不是OR。

+1

這就是我在閱讀問題後想到的:「這是很多無用的檢查。」 – Kevin

+0

@Walfrat。我感謝你的努力。只有當我的條件匹配時,我纔想返回true。一旦匹配它就不會前進。因爲我們知道在JavaScript中一旦返回true或false。謝謝 –

+0

我認爲這會減少檢查。並保持原樣。 –