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) !== -1
lo 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.indexOf
es que no funcionará en IE, lamentablemente incluso IE8 carece de este método.Array.indexOf
existe antes de anular,Array.prototype.indexOf
que 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
indexOf
porque puede probar correctamente la presencia deNaN
la lista, y puede igualar faltan elementos de la matriz como la del medio en[1, , 2]
queundefined
.includes
también funciona en matrices escritas en JavaScript comoUint8Array
.Si le preocupa la compatibilidad con el navegador (como IE o Edge), puede consultar
Array.includes
en 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
isInList
propiedad 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,
indexOf
siempre funciona. Sin embargo, para IE8 y versiones anteriores, necesitará un polyfill.Si
indexOf
devuelve -1, el elemento no está en la lista. Sin embargo, tenga en cuenta que este método no verificará correctamenteNaN
y, aunque puede coincidir con un explícitoundefined
, no puede coincidir con un elemento que faltaundefined
como en la matriz[1, , 2]
.Polyfill para
indexOf
oincludes
en 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.prototype
sea la mejor respuesta a largo plazo. La modificaciónObject
y losArray
prototipos 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 ... in
devolverá 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
of
en 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 usarincludes
como se indicó anteriormente.fuente
indexOf
proporcionada 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.indexOf
mé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).indexOf
ahora es compatible con IE 9 y superior de acuerdo con MDN .Las matrices tienen un
indexOf
mé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
Array
el prototipo: tal vez algo asíArray.prototype.contains
.RegExp
es 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 tuwhile
mé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