Estoy comprobando una variable, por ejemplo foo
, para la igualdad de varios valores. Por ejemplo,
if( foo == 1 || foo == 3 || foo == 12 ) {
// ...
}
El punto es que es bastante código para una tarea tan trivial. Se me ocurrió lo siguiente:
if( foo in {1: 1, 3: 1, 12: 1} ) {
// ...
}
pero tampoco me atrae por completo, porque tengo que dar valores redundantes a los elementos del objeto.
¿Alguien sabe una forma decente de hacer una verificación de igualdad contra múltiples valores?
javascript
pimvdb
fuente
fuente
Respuestas:
Podría usar una matriz y
indexOf
:fuente
indexOf
que solo está disponible desde la 5ta edición de ECMAScript.En ECMA2016 puede utilizar la incluye método. Es la forma más limpia que he visto. (Compatible con todos los principales navegadores, excepto IE (Polyfill está en el enlace)
fuente
if([a,b,c].includes(foo))
o cadenasif(['a','b','c'].includes(foo))
if([a,b,c].includes(foo))
porque las comillas lo convertirán en cadena. @HastigZusammenstellenUsando las respuestas proporcionadas, terminé con lo siguiente:
Se puede llamar así:
Editar: Me encontré con este 'truco' últimamente que es útil si los valores son cadenas y no contienen caracteres especiales. Para los caracteres especiales se vuelve feo debido al escape y también es más propenso a errores debido a eso.
Para ser más precisos, esto verificará la cadena exacta, pero nuevamente es más complicado para una simple prueba de igualdad:
fuente
in
es una palabra clave en Javascript. Por ejemplo, ejecutarfunction in() {}; in()
resultados en un error de sintaxis, al menos en Firefox, y no estoy seguro de por qué su código no lo hace. :-)Object.prototype
, ya que afectafor (foo in bar)
de manera desafortunada. ¿Quizás cambiarlofunction contains(obj) { for (var i = 1; i < arguments.length; i++) if (arguments[i] === obj) return true; return false; }
y pasar el objeto como argumento?Object.prototype
como también mencionas. Sin embargo, prefiero de esta manera, ya que la notación para la comprobación es encantadorafoo.in(1, 2, "test", Infinity)
, sencilla y sencilla.in()
la manera normal también falla en Chrome, pero el prototipo funciona ... :)Puede escribir
if(foo in L(10,20,30))
si defineL
serfuente
'remove' in L(1, 3, 12)
, aunque no lo hizo especifique 'eliminar' para colocar en la lista.Esto es fácilmente extensible y legible:
Pero no necesariamente más fácil :)
fuente
Tenga en cuenta que indexOf no está en el núcleo ECMAScript. Deberá tener un fragmento para IE y posiblemente otros navegadores que no admitan Array.prototype.indexOf.
fuente
Además, dado que los valores con los que está comprobando el resultado son únicos, también puede usar Set.prototype.has () .
fuente
Ahora puede tener una mejor solución para resolver este escenario, pero de otra manera que prefiero.
Preferí la solución anterior sobre la verificación indexOf donde también necesita verificar el índice.
incluye documentos
fuente
Me gustó la respuesta aceptada, pero pensé que sería bueno permitirle tomar matrices también, así que la expandí a esto:
Puede eliminar la coerción de tipo cambiando
==
a===
.fuente
Si tiene acceso a Underscore, puede usar lo siguiente:
contains
solía trabajar en Lodash también (antes de V4), ahora tienes que usarincludes
fuente
Esta es una pequeña función de ayuda auxiliar:
Más información aquí ...
fuente
const valToCheck = 'E'; const check = ['A', 'B', 'C', 'D'].some(option => option === valToCheck); // false
includes
convierte en la mejor opción, como en la respuesta de @ alister:const valToCheck = 'E'; const check = ['A', 'B', 'C', 'D'].includes(valToCheck); // false
Simplemente utilicé la función jQuery inArray y una matriz de valores para lograr esto:
fuente
Para la posteridad, es posible que desee utilizar expresiones regulares como alternativa. Muy buen soporte de navegador también (ref. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match#Browser_compatibility )
Prueba esto
fuente