En SQL podemos ver si una cadena está en una lista así:
Column IN ('a', 'b', 'c')
¿Cuál es una buena manera de hacer esto en JavaScript? Es tan torpe hacer esto:
if (expression1 || expression2 || str === 'a' || str === 'b' || str === 'c') {
   // do something
}
Y no estoy seguro sobre el rendimiento o la claridad de esto:
if (expression1 || expression2 || {a:1, b:1, c:1}[str]) {
   // do something
}
O uno podría usar la función de cambio:
var str = 'a',
   flag = false;
switch (str) {
   case 'a':
   case 'b':
   case 'c':
      flag = true;
   default:
}
if (expression1 || expression2 || flag) {
   // do something
}
Pero eso es un desastre horrible. ¿Algunas ideas?
En este caso, tengo que usar Internet Explorer 7 ya que es para una página de intranet corporativa. Por ['a', 'b', 'c'].indexOf(str) !== -1lo tanto , no funcionará de forma nativa sin un poco de azúcar de sintaxis.
                    
                        javascript
                                string
                                list
                                
                    
                    
                        ErikE
fuente
                
                fuente

Respuestas:
Puedes llamar a
indexOf:fuente
Array.prototype.indexOfes que no funcionará en IE, lamentablemente incluso IE8 carece de este método.Array.indexOfexiste antes de anular,Array.prototype.indexOfque no son lo mismo. Recomendaría la implementación realizada por Mozilla disponible aquí: developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/…EcmaScript 6
Si está utilizando ES6, puede construir una matriz de los elementos y usar
includes:Esto tiene algunas ventajas inherentes sobre
indexOfporque puede probar correctamente la presencia deNaNla lista, y puede igualar faltan elementos de la matriz como la del medio en[1, , 2]queundefined.includestambién funciona en matrices escritas en JavaScript comoUint8Array.Si le preocupa la compatibilidad con el navegador (como IE o Edge), puede consultar
Array.includesen CanIUse.Com , y si desea apuntar a un navegador o una versión de navegador que faltaincludes, recomiendo polyfill.io para polyfilling.Sin una matriz
Puede agregar una nueva
isInListpropiedad a las cadenas de la siguiente manera:Luego úsalo así:
Puedes hacer lo mismo por
Number.prototype.Array.indexOf
Si está utilizando un navegador moderno,
indexOfsiempre funciona. Sin embargo, para IE8 y versiones anteriores, necesitará un polyfill.Si
indexOfdevuelve -1, el elemento no está en la lista. Sin embargo, tenga en cuenta que este método no verificará correctamenteNaNy, aunque puede coincidir con un explícitoundefined, no puede coincidir con un elemento que faltaundefinedcomo en la matriz[1, , 2].Polyfill para
indexOfoincludesen IE, o cualquier otro navegador / versión que carece de soporteSi no desea utilizar un servicio como polyfill.io como se mencionó anteriormente, siempre puede incluir en su propio código fuente polyfills personalizados que cumplan con los estándares. Por ejemplo, Mozilla Developer Network tiene uno para
indexOf.En esta situación en la que tuve que hacer una solución para Internet Explorer 7, "desarrollé mi propia versión" más simple de la
indexOf()función que no cumple con los estándares:Sin embargo, no creo que modificar
Array.prototypesea la mejor respuesta a largo plazo. La modificaciónObjecty losArrayprototipos en JavaScript pueden provocar errores graves. Debe decidir si hacerlo es seguro en su propio entorno. La nota principal es que iterar una matriz (cuando Array.prototype ha agregado propiedades)for ... indevolverá el nuevo nombre de la función como una de las teclas:Su código puede funcionar ahora, pero en el momento en que alguien en el futuro agregue una biblioteca de JavaScript de terceros o un complemento que no esté protegiendo celosamente contra las claves heredadas, todo puede romperse.
La forma antigua de evitar esa ruptura es, durante la enumeración, verificar cada valor para ver si el objeto realmente lo tiene como una propiedad no heredada con
if (arr.hasOwnProperty(x))y solo luego trabajar con esox.La nueva forma ES6 para evitar este problema llave extra-es utilizar
ofen lugar dein,for (let x of arr). Sin embargo, a menos que pueda garantizar que todo su código y las bibliotecas de terceros se adhieran estrictamente a este método, a los fines de esta pregunta, es probable que solo desee usarincludescomo se indicó anteriormente.fuente
indexOfproporcionada por MDN. Básicamente hace lo mismo pero con un par de cortocircuitos para una evaluación fácil.La mayoría de las respuestas sugieren el
Array.prototype.indexOfmétodo, el único problema es que no funcionará en ninguna versión de IE antes de IE9.Como alternativa, te dejo dos opciones más que funcionarán en todos los navegadores:
fuente
"HiFooThere": en su lugar, iría con/^(?:Foo|Bar|Baz)$/(inicio de cadena, grupo sin captura, final de cadena).indexOfahora es compatible con IE 9 y superior de acuerdo con MDN .Las matrices tienen un
indexOfmétodo que puede usarse para buscar cadenas:fuente
Un truco que he usado es
Podrías hacer algo como
fuente
var i=a.length;while (i--) {/*use a[i]*/}es el método de bucle más rápido (si el orden inverso es aceptable).Aquí está el mío:
Este es más rápido si está de acuerdo con pasar una matriz:
Aquí está el jsperf: http://jsperf.com/bmcgin-inlsit
fuente
Arrayel prototipo: tal vez algo asíArray.prototype.contains.RegExpes universal, pero entiendo que estás trabajando con matrices. Entonces, mira este enfoque. Solía usarlo, ¡y es muy efectivo y extremadamente rápido!También puede aplicar algunas modificaciones, es decir:
Un trazador de líneas
Insensible a mayúsculas y minúsculas
¡Y muchos otros!
fuente
Usando indexOf (no funciona con IE8).
Para admitir IE8, puede implementar el indexOf de Mozilla.
Expresiones regulares a través de String.prototype.match (docs).
fuente
Parece que necesita usar la función in_array.
jQuery -> inArray
Prototipo -> Array.indexOf
O vea estos ejemplos si no está utilizando jQuery o Prototype:
Nota estilística: las variables llamadas thisthing thatthing, deben nombrarse para decirle algo sobre lo que contienen (sustantivo).
fuente
Además de
indexOf(que otros carteles han sugerido), el uso de Enumerable.include () del prototipo puede hacer que esto sea más claro y conciso:fuente
Gracias por la pregunta y la solución usando el método Array.indexOf.
Usé el código de esta solución para crear una función inList () que, en mi opinión, simplificaría la escritura y la lectura sería más clara:
USO:
fuente
'Houston'.inList(['LA', 'New York', 'Houston']). Quizásif (!String.prototype.inList) {String.prototype.inList = function(arr) {return arr.indexOf(this) >= 0};}o usando tuwhilemétodo.Me sorprende que nadie haya mencionado una función simple que tome una cadena y una lista.
fuente
int, donde algunas personas podrían encontrar esta pregunta en busca de una respuestabool. Pensé que podría ayudar a algunas personas.Mi solución da como resultado una sintaxis como esta:
Y lo implemento extendiendo el prototipo básico de Objeto, así:
Alternativamente, podríamos nombrar el método isInArray (pero probablemente no en Array) o simplemente isIn.
Ventajas: simple, directo y autodocumentado.
fuente
myValues[key];donde myValues es un objeto y la clave es cualquier cadena o número.Una versión simplificada de la respuesta de SLaks también funciona:
.... ya que las cadenas son una especie de matrices en sí mismas. :)
Si es necesario, implemente la función indexof para Internet Explorer como se describió antes que yo.
fuente