Foros del Web » Programando para Internet » Javascript »

DUDA: indexOf()-lastIndexOf()

Estas en el tema de DUDA: indexOf()-lastIndexOf() en el foro de Javascript en Foros del Web. Muy simple, pero no me entra esto, observen el siguiente código: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Javascript : Ver original var fruits = [ "oranges" , "apples" ...
  #1 (permalink)  
Antiguo 07/11/2014, 16:06
Avatar de Beatzoo  
Fecha de Ingreso: septiembre-2009
Ubicación: Retire Hill
Mensajes: 27
Antigüedad: 14 años, 7 meses
Puntos: 0
DUDA: indexOf()-lastIndexOf()

Muy simple, pero no me entra esto, observen el siguiente código:
Código Javascript:
Ver original
  1. var fruits = ["oranges", "apples", "pears", "apples"];
  2. var found_apples = fruits.indexOf("apples");
  3. window.alert(found_apples);
  4. found_apples = fruits.lastIndexOf("apples");
  5. window.alert(found_apples);
  6. found_apples = fruits.indexOf("grapes");
  7. window.alert(found_apples);

La primera alerta da 1, ya que empieza a contar de izquierda y exactamente, el índice es 1. Pero la segunda alerta da 3, si el lastIndex empieza por la derecha, ¿Cómo que da 3?
Es un ejemplo de un libro, está copiado tal cual.
Esta es la explicación literal (en inglés) que da el autor:

If you use lastIndexOf() to search for “apples” from
the back, then 3 will be returned, since the first instance of “apples” lastIndexOf() will detect
is the last one in the array at index 3


Es que esto de que aparezcan dos elementos "apple" creo que es lo que me confunde, ¿Alguien me puede echar una mano?

Gracias!
  #2 (permalink)  
Antiguo 07/11/2014, 16:36
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: DUDA: indexOf()-lastIndexOf()

El método indexOf, encuentra la posición de la primera aparición del elemento buscado en el array, empezando desde la izquierda, mientras que lastIndexOf, encuentra la posición de la última aparición del elemento buscado en el array. Tu array está formado de esta manera:

Código BASH:
Ver original
  1. Array(
  2.     0 => 'oranges',
  3.     1 => 'apples',
  4.     2 => 'pears',
  5.     3 => 'apples'
  6. )

Entonces, la primera aparición de 'apples', está en la posición número 1 del array, mientras que la última aparición, está en la posición 3.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 07/11/2014, 16:43
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: DUDA: indexOf()-lastIndexOf()

Hola:

No sé el funcionamiento de lastIndexOf, pero si empieza la búsqueda por la derecha, no se consideraría el cero como primer valor sino el atributo "lenght"...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #4 (permalink)  
Antiguo 07/11/2014, 20:53
Avatar de Beatzoo  
Fecha de Ingreso: septiembre-2009
Ubicación: Retire Hill
Mensajes: 27
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: DUDA: indexOf()-lastIndexOf()

Muchas gracias a ambos por las respuestas, pero todavía tengo algunas dudas:

@alexis88

indexOf busca la primera aparición empezando por la izquierda, correcto, y lasIndexOf busca la última aparición ¿Comenzando por la derecha?. Porque el autor pone bien claro que indexOf va de front to back y lastIndexOf va de back to front, o lo que es lo miso, desde atrás hacia delante, lo que yo he llamado de derecha a izquierda.
Lo de que buscaba la última aparición no lo sabía, entendí que ambos tienen la misma función, pero comenzando por lugares opuestos, algo no me cuadra, o el libro o tu explicación, porque decís cosas diferentes.

@caricatos

Es lo único que se me ocurre, y lo he pensado, que si empieza por la derecha no lo haga como índice 0, pero el autor no hace ninguna referencia a que este método no utilice índices, si no la propiedad length, lo cual me parece un gran error por su parte si se confirma lo que comentas.

Un saludo a los dos
Muchas gracias.
  #5 (permalink)  
Antiguo 07/11/2014, 21:10
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: DUDA: indexOf()-lastIndexOf()

Hola,

Posiblemente te aclare ciertas dudas, indexOf() busca del inicio de la cadena o del array hasta el final y te da la posición del elemento; mientras que lastIndexOf() busca desde el final de la cadena o el array hasta el principio y te da la posición del elemento encontrado.

Cita:
Iniciado por Beatzoo Ver Mensaje
...Lo de que buscaba la última aparición no lo sabía, entendí que ambos tienen la misma función, pero comenzando por lugares opuestos, algo no me cuadra, o el libro o tu explicación, porque decís cosas diferentes. ...
Da lo mismo, buscar desde el principio y encontrar la última vez que aparece; o buscar desde el final y encontrar la primera vez que "desde el final" aparece. El punto es que te da la posición del elemento que esta siendo buscado, siendo este el primero o el último.

En el caso de lastIndexOf() lógicamente no es lo mismo buscar de adelante o atrás, el primero desde adelante no va a ser ineficiente, mientras que el segundo, buscar de atrás hacia adelante va a ser mas eficiente porque busca menos. Pero eso ya son detalles internos de la implementación de Javascript.

Cita:
Iniciado por Beatzoo Ver Mensaje
... Es lo único que se me ocurre, y lo he pensado, que si empieza por la derecha no lo haga como índice 0, pero el autor no hace ninguna referencia a que este método no utilice índices, si no la propiedad length, lo cual me parece un gran error por su parte si se confirma lo que comentas. ...
Funciona dando la posición del elemento por un motivo muy importante, que se usa dentro de otras funciones, por ejemplo:

data.slice(data.indexOf(a), data.lastIndexOf(b));

Sino te diera la posición del elemento tendrías que estar haciendo ajustes al 'offset' de la posición final, como por ejemplo, length - lastIndexOf(). En otros lenguajes es primordial que funcione de esta forma para que muchas partes del lenguaje funcionen de forma lógica.

Saludos,
  #6 (permalink)  
Antiguo 07/11/2014, 21:39
Avatar de Beatzoo  
Fecha de Ingreso: septiembre-2009
Ubicación: Retire Hill
Mensajes: 27
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: DUDA: indexOf()-lastIndexOf()

Gracias HackmanC,

En cuanto a lo de la busqueda del elemento desde el principio o desde el final, de acuerdo. Cuando lei el mensaje despues de escribirlo me di cuenta de la tonteria xD.

En tu ultimo parrafo haces referencia a la posicion de elemento, entiendo que esto es el indice, y si, a espera de que me lo confirmes, dudo que se rija el lastIndexOf por el length, ya que entonces no comprenderia el uso del mismo metodo pero con el argumento que indica el indice en el que se empieza a buscar el elemento.

Pero me vas a perdonar, pero sigo sin entender el funcionamiento, porque segun me dices, los dos metodos son iguales, solo que uno empieza a buscar por la derecha y el otro por la izquierda. Pero entonces, segun mi logica, los indices para "apple" con un lastIndexOf serian 0 o 2, pero un 3? No lo pillo, seguro es una tonteria, esto me pasa muy a menudo me encanta liarme gratuitamente

Os pongo el siguiente parrafo, que habla sobre lo mismo, pero usando un argumento con el indice del array desde el que se comenzara la busqueda:


A second argument can be provided to either method to specify an index from which to begin searching. This allows indexOf() or lastIndexOf() to skip previous instances of an item and only return the index of the first item it finds starting from the specified index. For example, consider this code:

var fruits = ["oranges", "apples", "pears", "apples"];
var found_apples = fruits.indexOf("apples", 2);
window.alert(found_apples);
found_apples = fruits.lastIndexOf("apples", 1);
window.alert(found_apples);

In this case, calling fruits.indexOf(“apples”, 2) begins the search from front to back at index 2 rather than index 0. This means that it will bypass the first instance of “apples” at index 1, start the search at index 2, and return 3, since the next instance of “apples” is at index 3. Calling lastIndexOf(“apples”, 1) begins the search from index 1 and proceeds toward the front. In this case, the “apples” at index 3 is skipped and the search begins at index 1, where it finds “apples” and returns 1.

Gracias a todos y disculpad que no ponga tildes ahora mismo, pero estoy en un teclado que no es espanol.
  #7 (permalink)  
Antiguo 07/11/2014, 21:53
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: DUDA: indexOf()-lastIndexOf()

Hola,

Cita:
Iniciado por Beatzoo Ver Mensaje
... Pero me vas a perdonar, pero sigo sin entender el funcionamiento, porque segun me dices, los dos metodos son iguales, solo que uno empieza a buscar por la derecha y el otro por la izquierda. Pero entonces, segun mi logica, los indices para "apple" con un lastIndexOf serian 0 o 2, pero un 3? No lo pillo, seguro es una tonteria, esto me pasa muy a menudo me encanta liarme gratuitamente
Creo que posiblemente te confunde porque olvidaste que los índices comienzan de 0, como indica Alexis88 en su post, aunque creo que le hizo falta mencionarlo mas claro.

Código:
Array(
    0 => 'oranges',
    1 => 'apples',
    2 => 'pears',
    3 => 'apples'
)
Si usas indexOf('apples') te va a devolver 1, porque ese es su índice en la lista, si usas lastIndexOf('apples') te va a devolver 3 porque ese es su índice en la lista, de la última vez que aparece 'apples'.

Lo de agregar un parámetro adicional a los métodos ya es un agregado al mismo funcionamiento anterior, solamente que inicia la búsqueda donde le indiques, no desde el principio o el final dependiendo si es indexOf o lastIndexOf. En ese caso también es muy importante que devuelva el índice del elemento porque te sirve en la misma función.

lastIndexOf('apples', lastIndexOf('apples'));

En ese caso puedes usarlo en un bucle que vaya buscando todas las ocurrencias del elemento consecutivamente.

Saludos,
  #8 (permalink)  
Antiguo 07/11/2014, 22:05
Avatar de Beatzoo  
Fecha de Ingreso: septiembre-2009
Ubicación: Retire Hill
Mensajes: 27
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: DUDA: indexOf()-lastIndexOf()

Vale, ya esta, ya me llego la luz. Sabes que pasaba que, yo, muy inteligentemente, creia que el lastIndexOf, al empezar por la derecha empezaba tambien con indice 0 por la derecha, es decir, que "pears" para el lastIndex era indice 1 segun mi brillante logica. Es que muchas veces se me va la pinza de forma epica.
Bueno, muchas gracias a los 3 por los empujones, al final hemos podido arrancarlo.

Nos vemos!

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:28.