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.
Parece que necesitas usar la función in_array.
jQuery -> inArray
Prototipo -> Array.indexOf
O vea estos ejemplos si no está utilizando jQuery o Prototype:
- http://phpjs.org/functions/in_array:432
- http://www.bitrepository.com/equivalent-of-phps-in_array-function.html
- http://codingforums.com/showthread.php?t=63796
Nota estilística: las variables llamadas thisthing thatthing, se deben nombrar para contarle algo sobre lo que contienen (sustantivo).
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''));