saber objetos objects into existe exist elemento buscar array javascript string list

objetos - saber si un elemento existe en un array javascript



Determinar si la cadena está en la lista en JavaScript (13)

EcmaScript 6

Si está utilizando ES6, puede construir una matriz de elementos y usar includes :

[''a'', ''b'', ''c''].includes(''b'')

Sin una matriz

Puede agregar una nueva propiedad isInList a cadenas de la siguiente manera:

if (!String.prototype.isInList) { String.prototype.isInList = function() { let value = this.valueOf(); for (let i = 0, l = arguments.length; i < l; i += 1) { if (arguments[i] === value) return true; } return false; } }

Entonces úsalo así:

''fox''.isInList(''weasel'', ''fox'', ''stoat'') // true ''fox''.isInList(''weasel'', ''stoat'') // false

Puedes hacer lo mismo con Number.prototype .

Polyfill para indexOf usando IE8 y versiones anteriores

A falta de ES6, puede hacer lo mismo con indexOf en la mayoría de los navegadores (donde IE8 y versiones anteriores no forman parte de "la mayoría").

En esta situación, finalmente utilicé la función indexOf () y "rodé la mía" para Internet Explorer 7.

if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(item) { var i = this.length; while (i--) { if (this[i] === item) return i; } return -1; } }

Sin embargo, a largo plazo no creo que modificar Array.prototype sea ​​la mejor respuesta. Modificar prototipos de Object y Array en JavaScript puede provocar errores graves. Debe decidir si hacerlo es seguro en su propio entorno. De nota principal es que iterar una matriz (cuando Array.prototype tiene propiedades añadidas) con for ... in devolverá el nombre de la nueva función como una de las claves:

Array.prototype.blah = function() { console.log(''blah''); }; for (var x in [1, 2, 3]) { console.log(x); } // Result: 0 1 2 blah // Extra member iterated over

En SQL podemos ver si una cadena está en una lista como esta:

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 del 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 como lo es para una página intranet corporativa. Entonces [''a'', ''b'', ''c''].indexOf(str) !== -1 no funcionará de forma nativa sin un poco de azúcar de sintaxis.


Además de indexOf (que otros carteles han sugerido), el uso del prototipo Enumerable.include() puede hacer que este sea más claro y conciso:

var list = [''a'', ''b'', ''c'']; if (list.include(str)) { // do stuff }


Aquí está el mío:

String.prototype.inList=function(list){ return (Array.apply(null, arguments).indexOf(this.toString()) != -1) } var x = ''abc''; if (x.inList(''aaa'',''bbb'',''abc'')) console.log(''yes''); else console.log(''no'');

Este es más rápido si está bien al pasar una matriz:

String.prototype.inList=function(list){ return (list.indexOf(this.toString()) != -1) } var x = ''abc''; if (x.inList([''aaa'',''bbb'',''abc''])) console.log(''yes'')

Aquí está el jsperf: http://jsperf.com/bmcgin-inlsit


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 haría, IMO, hacer la escritura más simple y la lectura más clara:

function inList(psString, psList) { var laList = psList.split('',''); var i = laList.length; while (i--) { if (laList[i] === psString) return true; } return false; }

USO:

if (inList(''Houston'', ''LA,New York,Houston'') { // THEN do something when your string is in the list }


La mayoría de las respuestas sugieren el método Array.prototype.indexOf , 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:

if (/Foo|Bar|Baz/.test(str)) { // ... } if (str.match("Foo|Bar|Baz")) { // ... }


Las matrices tienen un método indexOf que se puede usar para buscar cadenas:

js> a = [''foo'', ''bar'', ''baz''] foo,bar,baz js> a.indexOf(''bar'') 1 js> a.indexOf(''quux'') -1


Me sorprende que nadie haya mencionado una función simple que lleva una cadena y una lista.

function in_list(needle, hay) { var i, len; for (i = 0, len = hay.length; i < len; i++) { if (hay[i] == needle) { return true; } } return false; } var alist = ["test"]; console.log(in_list("test", alist));


Mi solución da como resultado una sintaxis como esta:

// Checking to see if var ''column'' is in array [''a'', ''b'', ''c''] if (column.isAmong([''a'', ''b'', ''c'']) { // Do something }

Y implemento esto extendiendo el prototipo básico de objetos, así:

Object.prototype.isAmong = function (MyArray){ for (var a=0; a<MyArray.length; a++) { if (this === MyArray[a]) { return true; } } return false; }

Alternativamente, podríamos nombrar el método isInArray (pero probablemente no en Array) o simplemente isIn.

Ventajas: Simple, directo y autodocumentado.



Puede llamar a indexOf :

if ([''a'', ''b'', ''c''].indexOf(str) >= 0) { //do something }


Un truco que he usado es

>>> ("something" in {"a string":"", "somthing":"", "another string":""}) false >>> ("something" in {"a string":"", "something":"", "another string":""}) true

Podrías hacer algo como

>>> a = ["a string", "something", "another string"]; >>> b = {}; >>> for(var i=0; i<a.length;i++){b[a[i]]="";} /* Transform the array in a dict */ >>> ("something" in b) true


Una versión simplificada de la respuesta de SLaks también funciona:

if (''abcdefghij''.indexOf(str) >= 0) { // Do something }

.... ya que las cadenas son una especie de arreglos. :)

Si es necesario, implemente el índice de función para Internet Explorer como se describió antes que yo.


RegExp es universal, pero entiendo que está trabajando con matrices. Entonces, mira este enfoque. ¡Uso para usarlo, y es muy efectivo y rápido!

var str = ''some string with a''; var list = [''a'', ''b'', ''c'']; var rx = new RegExp(list.join(''|'')); rx.test(str);

También puede aplicar algunas modificaciones, es decir:

Un trazador de líneas

new RegExp(list.join(''|'')).test(str);

Case insensible

var rx = new RegExp(list.join(''|'').concat(''/i''));


¡Y muchos otros!