Continuando con nuestra serie de artículos de iniciación a JavaScript hoy hablaremos del método indexOf() y cómo funciona. Cuando trabajamos manipulando un string es bastante frecuente que necesitemos conocer si un elemento determinado existe y en qué posición. Por supuesto podemos crear un método que recorra todos los elementos contenidos pero existe un método más eficiente y que nos ahorrará mucho tiempo.
Así empleando el método indexOf() éste nos ofrecerá el primer índice en el que se puede encontrar un elemento dado en el array, ó en su defecto retornará el valor -1 si el elemento no está presente.
Antes de ver algunos ejemplos cabe destacar que indexOf compara cada uno de los elementos usando lo que llamamos una igualdad estricta, es decir, el mismo método que cuando se usa ===, o también conocido como operador de igualdad-triple. ¿Esto qué quiere decir? Que para indexOf “Casa y casa” no son iguales.
cadena.indexOf(valorBusqueda[, indiceDesde])
Dicho esto, explicado en qué consiste, ahora toca mostrar algunos ejemplos de uso de IndexOf(). Un primer acercamiento para familiarizarnos pasa por localizar ciertos valores dentro de un array dado. Por ejemplo:
var cadena = "Blue Whale";
cadena.indexOf("Blue") // retorna 0
cadena.indexOf("Blute") // retorna -1
cadena.indexOf("Whale",0) // retorna 5
cadena.indexOf("Whale",5) // retorna 5
cadena.indexOf("",9) // retorna 9
cadena.indexOf("",10) // retorna 10
cadena.indexOf("",11) // retorna 10
El método indexOf() también puede ser empleado para manejar Arrays, como se muestra a continuación:
var cadena = [2, 9, 9];
cadena.indexOf(2); // retorna 0
cadena.indexOf(7); // retorna -1
array.indexOf(9, 2); // retorna 2
array.indexOf(2, -1); // retorna -1
array.indexOf(2, -3); // retorna 0
Pero qué sucede si lo que buscamos son todas las coincidencias que encontramos dentro de una cadena de caracteres o como en este ejemplo en un array. Para encontrar todas las apariciones de un elemento dado lo que haremos será recorrer el array con un bucle while y almacenar las ocurrencias mediante un array que llamaremos indices:
var indices = [];
var array = ['a', 'b', 'a', 'c', 'a', 'd'];
var element = 'a';
var idx = array.indexOf(element);
while (idx != -1) {
indices.push(idx);
idx = array.indexOf(element, idx + 1);
}
console.log(indices);
// [0, 2, 4]
array.indexOf(searchElement[, fromIndex])
Rizando un poco más el rizo podemos crear un método que en que si el elemento ya existe en la matriz no se actualizará la matriz:
function updateVegetablesCollection (veggies, veggie) {
if (veggies.indexOf(veggie) === -1) {
veggies.push(veggie);
console.log('La nueva colección de vegetales es: ' + veggies);
} else if (veggies.indexOf(veggie) > -1) {
console.log(veggie + ' ya existe en la colección de verduras.');
}
}
var veggies = ['patata', 'tomate', 'chiles', 'pimientoverde'];
updateVegetablesCollection(veggies, 'espinaca');
// La nueva colección de verduras es : patata, tomate, chiles, pimientoverde, espinaca
updateVegetablesCollection(veggies, 'espinaca');
// La espinaca ya existe en la colección de verduras.
Como podemos ver indexOf resulta, para este caso, una herramienta de mucha utilidad y que ofrece posibilidades muy interesantes en el desarrollo de nuestros proyectos.
Es posible que a estas alturas del artículo que para qué usar IndexOf si existe el método Search(). Ambos métodos son diferentes y responden a cubrir diferentes escenarios. Por ejemplo si IndexOf() es un método rápido y especialmente indicado para trabajar con subcadenas simples, en cambio Search() permite hacer uso de expresiones regulares, por lo que permite mayor flexibilidad al hacer coincidir patrones más sofisticados, cadenas insensibles a mayúsculas y minúsculas, etc.
Pero quizá la mejor forma de entenderlo es poniendo ambos métodos a trabajar en un mismo ejemplo para poder conocer sus diferencias.
Ejemplo:
<html>
<head>
<title>JavaScipt Example</title>
</head>
<body>
<script>
var str = "friends say Hello";
var substr = "Hello";
var index = str.indexOf(substr);
if(index!=-1)
document.write(substr + " found at " + index + " position.<br>");
else
document.write(substr + " does not exist in the " + str + ".<br>");
var substr = "Hello";
var index = str.search(substr);
if(index!=-1)
document.write(substr + " found at " + index + " position.<br>");
else
document.write(substr + " does not exist in the " + str + ".<br>");
substr = "Hi";
index = str.indexOf(substr);
if(index!=-1)
document.write(substr + " found at " + index + " position.<br>");
else
document.write(substr + " does not exist in the " + str + ".<br>");
substr = "Hi";
index = str.search(substr);
if(index!=-1)
document.write(substr + " found at " + index + " position.<br>");
else
document.write(substr + " does not exist in the " + str + ".<br>");
</script>
</body>
</html>
Hello found at 12 position.
Hello found at 12 position.
Hi does not exist in the friends say Hello.
Hi does not exist in the friends say Hello.
Del siguiente ejemplo podemos ver claramente cómo funcionan ambos métodos. Mientras que el método IndexOf() dispone de un parámetro opcional que actúa de índice, el método Search() carece de éste y simplemente toma la subcadena y comienza a buscar desde la posición indice 0.
Y con esto llegamos al final del artículo de hoy. En él hemos hablado sobre el método IndexOf(), características y modo de empleo pero también hemos tenido oportunidad de tratar acerca del método Search() que puede ser usado como alternativa y visto sus diferencias con IndexOf().
La conveniencia de utilizar uno y otro método corresponde ahora a nosotros en nuestra elección.