2012-04-02 14 views
9

Ich habe 3 Werte, die ich f, g und h vergleichen möchte. Ich habe einen Code, um zu überprüfen, dass sie alle gleich sind und keiner von ihnen null ist. Ich habe online nachgesehen, konnte aber nichts finden, was meine Anfrage zu beantworten schien. Derzeit bin Überprüfung ich den Code in folgender Weise ...Javascript vergleichen 3 Werte

if(g == h && g == f && f == h && g != null && f != null && h != null) 
{ 
//do something 
} 

Das ist ziemlich langatmig und ich könnte mehr Werte werden hinzugefügt, so frage mich, ich nur, wenn es ein schneller Weg ist, dass keiner der überprüfen Werte sind null und dass alle Werte gleich sind?

Vielen Dank im Voraus für jede Hilfe.

+0

können Sie diese Werte in ein Array einfügen? –

+0

Sie müssen nicht alle Variablen überprüfen, wenn sie '! = Null 'sind. Wenn sie zwischen ihnen gleich sind, können Sie nur eine gegen' null 'prüfen. Dasselbe gilt für die Überprüfung von 'f == h '.. Wenn sowohl' f 'als auch' h 'gleich' g 'sind, müssen Sie diese beiden nicht überprüfen. –

+0

haben Sie die Trade-Offs verglichen, in die alle Var gesetzt wurden eine Anordnung? – cctan

Antwort

27

Sie, dass


zu

if(g === h && g === f && g !== null) 
{ 
//do something 
} 
verkürzen konnte

Für eine tatsächliche Möglichkeit, mehrere Werte zu vergleichen (unabhängig von ihrer Anzahl)
(von/vereinfachte @Rohan Prabhu)

function areEqual(){ 
    var len = arguments.length; 
    for (var i = 1; i< len; i++){ 
     if (arguments[i] === null || arguments[i] !== arguments[i-1]) 
     return false; 
    } 
    return true; 
} 

und nennen dies mit

if(areEqual(a,b,c,d,e,f,g,h)) 
{ 
//do something 
} 
+0

Sie könnten sogar das '! = Null' – m90

+0

@ m90 weglassen, warum? Was wenn alle null sind? –

+0

@ m90 kaufen was, wenn alle von ihnen null sind? dann wird es zu "wahr" auswerten. – David

4

eine einfache Funktion schreiben:

var checkAllArguments = function() { 
    var len = arguments.length; 
    var obj; 

    if(len == 0) { 
     return true; 
    } else { 
     if(arguments[0] == null) { 
      return false; 
     } else { 
      obj = arguments[0]; 
     } 
    } 

    for(var i=1; i<len; i++) { 
     if(arguments[i] == null) { 
      return false; 
     } 

     if(obj == arguments[i]) { 
      continue; 
     } else { 
      return false; 
     } 
    } 

    return true; 
} 

nun mehrere Argumente zu überprüfen, alles, was Sie tun müssen, ist:

if(checkAllArguments(g, h, f)) { 
    // Do something 
} 
4

Antwort inspiriert Ich schlage vor, Sie eine Funktion schreiben, wo Sie mit allen ein Array geben die Werte, die Sie vergleichen möchten, und dann durchlaufen das Array, um die Werte zu vergleichen, die sich gegenseitig:

function compareAllValues(a) { 
    for (var i = 0; i < a.length; i++) { 
     if (a[i] === null) { return false } 
     for (var j = 0; j < i; j++) { 
      if (a[j] !== a[i]) { return false } 
     } 
    } 

    return true; 
} 

das sollte es sein, denke ich :)

+0

Ihre soln. ist viel Platz komplexer als es sein sollte. –

4

Funktioniert für eine beliebige Anzahl von Elementen.

ES5

if ([f, g, h].every(function (v, i, a) { 
    return (
    v === a[0] && 
    v !== null 
); 
})) { 
    // Do something 
} 

ES2015

if ([f, g, h].every((v, i, a) => 
    v === a[0] && 
    v !== null 
)) { 
    // Do something 
} 
0

hinzufügen distinct Funktion Array.prototype:

Array.prototype.distinct = function() { 
    var result = []; 
    for(var i = 0; i < this.length; i++) { 
     if (result.indexOf(this[i]) == -1) { 
      result.push(this[i]); 
     } 
    } 
    return result; 
} 

Dann tun:

var myArray = [f, g, h]; 
if (myArray.indexOf(null) == -1 && myArray.unique().length == 1) 
{ 
    // no nulls and all elements have the same value! 
}