2012-04-02 10 views
9

Mam 3 wartości, które chcę porównać f, g i h. Mam trochę kodu, aby sprawdzić, czy wszystkie są sobie równe i że żaden z nich nie jest pusty. Oglądałem online, ale nie mogłem znaleźć niczego, co odpowiadałoby na moje pytanie. Obecnie jestem sprawdzając kod w następujący sposób ...Javascript porównaj 3 wartości

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

To dość długo zdyszany i może być dodanie większej wartości, więc po prostu zastanawiasz się, jeśli istnieje szybszy sposób, aby sprawdzić, czy żaden z wartości są zerowe i wszystkie wartości są sobie równe?

Z góry dziękuję za pomoc.

+0

Czy będziesz w stanie umieścić te wartości w tablicy? –

+0

Nie musisz sprawdzać wszystkich zmiennych, jeśli są one "! = Null". Jeśli są równe między nimi, możesz zaznaczyć tylko jedną wartość 'null'. To samo z sprawdzeniem 'f == h' .. jeśli zarówno' f', jak i 'h' są równe' g', nie musisz sprawdzać tych dwóch .. –

+0

czy porównałeś kompromisy związane z umieszczeniem wszystkich zmiennych w tablica? – cctan

Odpowiedz

27

Można skrócić że do

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

Aby uzyskać rzeczywisty sposób porównywania wielu wartości (niezależnie od ich liczby)
(zainspirowany/uproszczone @Rohan Prabhu odpowiedź)

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

i nazywają to z

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

Można nawet pominąć '! = Null' – m90

+0

@ m90, dlaczego? co jeśli wszystkie są zerowe? –

+0

@ m90 kupić, co jeśli wszystkie z nich są zerowe? wtedy oceni na "true". – David

4

napisać prostą funkcję:

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

Teraz, aby sprawdzić wiele argumentów, wszystko co musisz zrobić, to:

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

Proponuję napisać funkcję, gdzie dajesz tablicę ze wszystkimi wartości, które chcesz porównać, a następnie wykonaj iterację w tablicy, aby porównać wartości:

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

to powinno być to, myślę :)

+0

Twój soln. jest dużo bardziej złożona niż powinna być. –

4

Działa dla dowolnej liczby przedmiotów.

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

Dodaj distinct funkcja 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; 
} 

Następnie wykonaj:

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