2012-04-02 15 views
9

Tengo 3 valores que quiero comparar f, g y h. Tengo un código para verificar que todos coincidan entre sí y que ninguno de ellos sea nulo. He echado un vistazo en línea pero no he podido encontrar nada que parezca responder a mi consulta. Actualmente estoy comprobando el código de la siguiente manera ...Javascript compare 3 valores

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

Esto es bastante largo aliento y que podría ser la adición de más valores, por lo que me estaba preguntando si hay una manera más rápida para comprobar que ninguna de las los valores son nulos y todos los valores son iguales?

Gracias de antemano por cualquier ayuda.

+0

¿Estarás bien si colocas esos valores en una matriz? –

+0

No es necesario que verifique todas las variables si son '! = Null' .. Si son iguales entre ellas, puede verificar solo una contra' null'. Lo mismo con la comprobación de 'f == h' .. si ambos' f' y 'h' son iguales a' g' no tiene que verificar esos dos .. –

+0

¿ha comparado las compensaciones de poner todas las var en ¿una matriz? – cctan

Respuesta

27

Usted podría acortar ese a

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

Para una forma real de comparar valores múltiples (independientemente de su número)
(inspirado por/simplificado @Rohan Prabhu respuesta)

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

y llaman a esto con

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

Incluso podría omitir '! = Null' – m90

+0

@ m90, ¿por qué? ¿y si todos son nulos? –

+0

@ m90 ¿Qué pasa si todos son nulos? entonces evaluará a 'verdadero'. – David

4

escribir una función simple:

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

Ahora, para comprobar múltiples argumentos, todo lo que tiene que hacer es:

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

Le sugiero que escriba una función donde se aplica una matriz con todos los valores que desea comparar y luego iterar a través de la matriz para comparar los valores entre sí:

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

que debería ser, creo :)

+0

Su Soln. es mucho más complejo de lo que debería ser. –

4

Funciona para cualquier cantidad de artículos.

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

Añadir una función para distinctArray.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; 
} 

Luego hacer:

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