Solo para hacer ejercicio con el método indexOf() y para tener una mejor familiaridad con su funcionamiento y lo que se puede hacer con él, deseo imprimir el índice de cada carácter en una frase, uno por uno.

Podría hacerlo con éxito manualmente, de esta manera:

// Print index for char of phrase (case insensitive):

let phrase = "ab";

alert(phrase.indexOf("a")); // 0
alert(phrase.indexOf("b")); // 1
alert(phrase.indexOf("z")); // -1

Pero cuando intenté usar un bucle, fallé:

// Print char by index:

let phrase = "ab";

for (let i = -1; i < phrase.indexOf(); i++) {
    alert(phrase.length[i]);
}

También intenté con regex para apuntar a cada personaje dentro de phrase pero también fallé:

let phrase = "ab";

for (let i = -1; i < phrase.indexOf(/./); i++) {
    alert(phrase.length[i]);
}

Para aclarar, mi objetivo es tener una primera alerta con 0, y la segunda con 1. Solo quiero imprimir el índice de cada carácter, en lugar de la longitud del carácter, como se puede hacer fácilmente con:

phrase.length // 2.

¿Cómo podría imprimir el índice de cada personaje en alertas separadas?

Es muy importante para mí usar indexOf() dentro de un bucle para conocer esta sintaxis.

1
Arcticooling 29 oct. 2017 a las 17:12

5 respuestas

La mejor respuesta

Para imprimir el índice de cada carácter en un bucle no necesita indexOf()

let phrase = "ab";
for (let i = 0; i < phrase.length; i++) {
    alert (i);
}

Porque i es el índice exacto que necesitas.

De hecho, si usa indexOf() en un bucle, así es como se ve:

let phrase = "ab";
for (let i = 0; i < phrase.length; i++) {
    alert (phrase.indexOf (phrase[i]));
}

El mismo resultado que antes, pero esta vez, en lugar de mostrar i, recupera el elemento actual en phrase y usa indexOf() para obtener el índice ya conocido.

EDITAR: indexOf() en este caso funciona como se esperaba porque las letras en phrase son diferentes. Pero como dijo SamVK si let phrase = "banana";, no puede funcionar porque siempre devolverá 1 para la letra 'a', por lo que no debe usarlo para ese tipo de bucle.

No utilicé let i = -1 porque no es un índice de phrase. Es justo lo que devuelve indexOf() si no puede encontrar el elemento dado.

Espero que ayude.

0
Yoiki 30 oct. 2017 a las 17:53

Si absolutamente quiere usar indexOf en un bucle, puede hacerlo:

let phrase = "ab";

Array.from(phrase).forEach(char => {
  console.log(phrase.indexOf(char))
})

Pero esto es bastante inútil ya que hay formas más sencillas de lograrlo, pero como parece ser para un propósito de aprendizaje, ¡espero que esta respuesta te ayude!

0
3Dos 29 oct. 2017 a las 14:19

No uses indexOf. Utiliza este método para obtener la posición (índice) de un determinado carácter en la cadena:

Una cadena tiene una propiedad de longitud y se puede iterar:

let phrase = "aaabbbaaaabbb"

function getAllIndices(stringInput) {

  for (let i = 0; i < stringInput.length; i++) {
  //you simply need to output i.
      console.log(stringInput[i] + " > " + i);
  }
}

getAllIndices(phrase);
1
Mouser 29 oct. 2017 a las 14:27

Podrías hacerlo de esta manera:

for(let i=0; i<phrase.length; i++) {
    console.log(phrase.indexOf(phrase[i]));
}
1
br.julien 29 oct. 2017 a las 14:19

Aunque no siempre es el caso: el formato más común para un bucle for es:

for (let i = 0; i < someVariable.length; i++) { //...some code }

Y de hecho eso es lo que quieres aquí.

Significa:

  • comenzar en i siendo 0 (i = 0)
  • Haz lo que sea que esté en mi cuerpo (// ...some code)
  • aumentar i en 1 (i++)
  • Repita, hasta que sea igual a uno menos que la longitud de someVariable (someVariable.length) *

* Ese último paso puede parecer un poco confuso. Recuerde: los índices comienzan en 0, pero la longitud cuenta, bueno, cuenta normal, así que comienza en 1. Entonces, una cadena de longitud 3, diga 'c' + 'a' + 't'. está formado por caracteres en los índices [0, 1, 2]. Entonces, quieres que el ciclo se detenga en ese último índice, 2, que es (siempre) uno menos que la longitud. (Pero, sinceramente, esto está sobreexplicándolo. La respuesta corta es: si quieres recorrer algo, 99 de cada 100 veces quieres que el formato exacto for loop sea el primero.


Entonces, para ver su ejemplo: queremos arreglar tres cosas:

  • Queremos tener let i = 0; (recuerde que no se incrementa hasta que se ejecuta una vez
  • Queremos decir i < phrase.length; (i < phrase.indexOf() no significa nada. phrase.indexOf() es una función, no un número).
  • phrase.length significa "dime la longitud de la frase variable". Solo devuelve un número. (Entonces phrase.length[i] no significa nada). Si desea alertar cualquier letra que esté en este índice, es solo phrase[i]. * *

* Si esta sintaxis para obtener una letra simplemente poniendo [#] después de las cadenas parece extraña, bueno, eso es porque estaba más diseñada para matrices. Si tiene let arr = ['a', 'b', 'c'], entonces claro, podría ver por qué los desarrolladores de JavaScript dijeron "hagamos una forma rápida de obtener, oh, el valor en el índice 2 de una matriz. ¿Qué tal solo arr[2]? Pero para mayor coherencia, dijeron "sí, claro, demos esta habilidad a las cadenas". Y si lo piensas bien, una cadena es algo así como un conjunto de letras.


Actualización: acabo de darme cuenta de que querías el índice de cada letra, no la letra en sí. Bueno ... técnicamente podrías simplemente alert(i) entonces. Eso es, ese es el índice. Pero si quisieras saber de qué carta estamos hablando, haría algo como alert("Letter " + phrase[i] + " is at index " + i)


Entonces nuestra respuesta final es:

let phrase = "ab";

for (let i = 0; i < phrase.length; i++) {
    alert("Letter " +  phrase[i] + " is at index " + i)
}


Es muy importante para mí usar indexOf() dentro de un bucle para conocer esta sintaxis.

Nunca usarías indexOf() para algo como esto. No solo sería innecesario, estaría mal. Si tuviera la cadena banana e intentara usar indexOf() para (re) verificar la posición de cada letra, obtendría 0,1,2,1,2,1. ¿Por qué? Porque indexOf() solo devuelve el índice de la primera instancia de esa letra.

indexOf() no es algo que probablemente emparejarías con un bucle for, al menos no un bucle for buscando la misma cadena. Es un bucle en sí mismo. Su trabajo es evitar que tenga que escribir un bucle for para encontrar el índice de "b" en "ab". Lo hará por ti.

1
SamVK 29 oct. 2017 a las 15:02