2017-05-31 3 views
10

hier die einige Probenleitung von Codes zu optimieren ..Wie eine große Anzahl von if-else if-else-Ausdrücke

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) { 

} 

Wie diese Bedingung zu behandeln. wenn ich 5 Aussage habe. Dann muss es fast 12 + Bedingung eins nach dem anderen sein. Wenn ich alle 5 Kombinationen überprüfe, geht es zu mehr Linien des Codes, haben wir irgendeine bessere Möglichkeit, alle Bedingungen zu überprüfen.

+5

Von den 3 oben wiederholen Sie die letzten 3 Prüfungen, Sie könnten sie einmal überprüfen und eine if-Anweisung verschachteln, wenn für den Rest. –

+0

Sie möchten also einen if-elseif-else Zweig mit allen Möglichkeiten dieser Variablen haben? 'Preis> 0 || jsBed <= Schlafzimmer || jsBuilt> = built' erscheint doppelt. Nicht sicher, ob Sie zB 'jsBed> Schlafzimmer 'überprüfen möchten? – KarelG

+1

Versuchen Sie, die Gesamtzahl der erfüllten Bedingungen zu finden? (2. und 3. Bedingung sollten gleich behandelt werden) Oder haben Sie unterschiedliche Implementierungen, je nachdem, welche Bedingung erfüllt ist? –

Antwort

12

Wenn Sie einen Booleschen Ausdruck als Integer in JavaScript zu behandeln, wird es zu 0 (für false) bewerten oder 1 (für true). So könnte man die Bedingungen summieren und dann einen switch-case-Konstrukt verwenden, um zu überprüfen, wie viele waren wahr:

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

verwenden Es sieht vernünftig aus .. Ich denke darüber nach .. Danke @Mureinik –

+0

@MArfan Wie angegeben, dies ist einer der beste Lösung, aber wenn es andere Kombinationen gibt, bitte fügen Sie sie zur Frage hinzu. Es kann andere Ansätze geben, die helfen können. – Rajesh

+6

Also ist loc = 0, cat = 1 wird als loc = 1, cat = 0 behandelt. Dies löst das Beispiel von OP nicht. Es prüft nur die Gesamtzahl der erfüllten Bedingungen. –

0

Da Ihre drei Bedingungen festgelegt sind, können Sie sie zuerst haben, andere folgen, was umgerechnet werden können Schaltergehäuse.

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' kann durch '+ (loc> 0)' ersetzt werden. Auch wenn OP eine Mehrfach-ODER-Bedingung hat, muss Code ausgeführt werden, auch wenn die letzten 3 Bedingungen falsch sind. Ihr Code wird nicht funktionieren – Rajesh

+0

Ich habe es nicht verstanden. versuchen zu verstehen. –

+0

Dies entspricht nicht dem OP-Code.Wenn 'Preis> 0 || jsBed <= Schlafzimmer || jsBuilt> = built' ist 'false' wenn' loc' & 'cat' positive Zahlen sind, wird der Code überhaupt nicht ausgeführt. Während in OP-Code wird zuerst 'if' Anweisung Körper ausgeführt werden. – Tushar

1

edit1: Modifizierte für Javascript, nicht Java. Hoppla ...

Ich bin mir nicht sicher, ob Sie alle Kombinationen sehen möchten, aber Sie können sie gruppieren, indem Sie für jeden möglichen Ausgang einen numerischen Wert eingeben.

Konkret gibt es 5 Variablen und 2 Optionen jede Variable? Ich habe eine Tabelle mit Zahlen in Binärdarstellung eingerichtet. Wenn es je> 2 Optionen gibt (oder bei einigen Variablen), müssen Sie Zahlen (Basis 10) verwenden. Sie können binäre Werte verwenden wie

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

So können Sie gruppieren sie in einem Verfahren:

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

die

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

macht (Ich habe die anderen Vars weggelassen ...) Dann Addieren Sie die Binärwerte

const total = locVal + catVal + priceVal 

Dann müssen Sie jetzt einen Schalter Case-Anweisung wie

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 
} 

Die Werte in den case stellen den ganzzahligen Wert der binären Sequenz, die in total verwenden. Es ist zu beachten, dass es sehr wichtig Dokument der Code sehr gut ist, vor allem die Fallblöcke, so dass andere Leser direkt herausfinden können, welcher Wert für was steht (wie ich).

Wenn es mehr als zwei Optionen pro variabel ist, können Sie in Faktoren von 10 arbeiten (wie in Methode foo verwenden (trueCond ? 1 : 0) * Math.pow(10, level))

+3

Dies ist keine Java-Frage. – user694733

2

5 Bedingungen sind 2 ** 5, das heißt 32 Kombinationen.

Wenn Sie nach verschiedenen Kombinationen suchen möchten, ohne die Tests zu wiederholen, können Sie die einzelnen Ergebnisse bitweise verschieben und für eine Switch-Anweisung kombinieren. mit den Zahlen arbeiten, ist direkt knappe, aber nicht sehr gut lesbar

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; 
 
}

modifizieren diese Konstanten verwenden würde die switch-Anweisung lesbarer

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); 
 
}

machen Sie könnten con verwenden stants

4

Sie haben Bedingung zu helfen, die nie erfüllt sein:

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) { 

} 

Grundsätzlich gilt:

  • Am zweiten sonst, wenn die Bedingung cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built nutzlos ebcause ist in der ersten bereits erfüllt. Da Sie eine else if verwenden, werden sie bereits in der ersten if eingeben. Der einzige, der zählt, ist loc < 0.
  • Für die letzten elseif ist nur cat < 0 relevant.

So kann es zu

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) { 

} 

Diese Antwort neu geschrieben werden, setzen voraus, dass der bereitgestellte Code derjenige ist, dass Sie versuchen eine generische Probe zu vereinfachen und nicht.

Hinweis: Ich denke, Sie haben vielleicht nicht geschrieben, was Sie tun wollten, vergessen einige UND statt OR.

+1

Das dachte ich, nachdem ich die Frage gelesen hatte: "Das sind viele nutzlose Überprüfungen." – Kevin

+0

@Walfrat. Ich schätze Ihre Bemühungen. Ich möchte nur dann true zurückgeben, wenn meine Bedingung übereinstimmt. Einmal Übereinstimmung wird es nicht vorwärts bewegen. Weil wir in JavaScript einmal wissen, true oder false zurück. danke –

+0

ich denke, es wird die Schecks reduzieren. und Zustand bleiben so wie es ist. –

Verwandte Themen