entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

-1voto

Undefined en array

antes de todo pido disculpas al administrador si es que esta pregunta puede llegar a ser una duplicacion, sin embargo no es asi, necesito una explicacion porque por mas que me esfuerzo no entiendo porque pasa esto en mi siguiente codigo

<div id="output"></div>
<button onclick="combinare()">start</button>

   <script type="text/javascript">
function combinare() {
        // body...

        codici = [];

            for(var x=0; x<15; x++){

                /*combo =  math.randomInt(999999)*/
                combo =  Math.floor((Math.random() * 1000000) + 1);

                if(combo.toString().length == 6) {

                codici.push(combo);

                document.getElementById('output').innerHTML += codici[x] + "<br>"

                    }

            }

        }
</script>

al momento de invocar mi funcion, en mi pagina se imprime la siguiente lista de numeros

956720
172101
673672
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined
undefined

Sin embargo en mi array no hay ningun undefined, como es esto posible??

Array [ 956720, 172101, 673672, 333530, 852296, 306690, 364363, 113926, 699769, 185378, altri 4… ]

Peter comentado Sep 5

Si no es repetida, puedes abrir 100 preguntas, pero por favor intenta utilizar títulos descriptivos. "Necesito ayuda", "Tengo un problema", "No se que pasa" y similares, no ayudan en nada a entender el problema al ver el título.

Saludos.

riccardo94 comentado Sep 5

tio pro favor explicame tu porque en mi array si tengo 15 numeros con 6 digitos y en mi pagina solo 5, porque esos 10 numeros de mi array no se imprimieron tambien en la pagina, despues de todo mi ciclo solo puede hacer 15 iteraciones para quitar la ipotesis de que si la funcion matematica no genera un numero de 6 digitos pierde una iteracion, estoy muy confundido, el otro tio que no recuerdo su nombre me intento explicar pero no le entendi bien, por favor ayudame a entender, gracias

carlossevi comentado Sep 6

Efectivamente, es la misma pregunta exactamente que esta otra: https://entredesarrolladores.com/16572/problema-con-funcion-math

Me alegro de que esta vez alguien te haya hecho entender el problema del bucle y los índices del array.

magarzon comentado Sep 7

No había visto la duplicada, si lo sé ni me molesto, porque le has dado casi exactamente la misma explicación y sigue sin pillarlo.

1 Respuesta

2votos

magarzon Puntos22090

Lo que te ha pasado es esto:

En la cuarta iteración (x = 3), ha salido un número que no tenía 6 dígitos, por lo que no los has añadido al array, pero has seguido aumentando el valor de x, y estás accediendo al valor del array por ese x, con lo que al final tienes:

x = 0, combo = 956720, tamaño de codici:1, sacas por pantalla: codici[0]=> 956720
x = 1, combo = 172101, tamaño de codici:2, sacas por pantalla: codici[1] => 172101
x = 2, combo = 673672, tamaño de codici:3, sacas por pantalla: codici[2] => 673672
x = 3, combo = ????, tamaño de codici:3, sacas por pantalla: codici[3] => undefined
x = 4, combo = 333530, tamaño de codici:4, sacas por pantalla: codici[4] => undefined
...

Espero que así de claro lo comprendas.
No sé si necesitas el array codici para algo, si no, con que simplemente uses el valor de combo a la hora de añadirlo al html, te vale. Si necesitas codici, con que aumentes el valor de x solo cuando se cumple la condición, también funcionaría (aunque es peligroso porque puedes entrar en un bucle infinito si cometes algún error)

riccardo94 comentado Sep 5

Muchas gracias amigo, ahora si me quedo claro, tengo todavia una duda, como veras mi codigo imprime algunos numeros con 6 digitos y el resto son undefined, en cambio en mi array hay 15 elementos y todos son numeros de 6 digitos, por este motivo mi duda es la siguiente si tengo 15 iteraciones porque cada vez que mi combo falla y no genera un numero de 6 digitos no consumo 1 iteracion y redusco la longitud de mi array codici? por este hecho no me explico como en mi array hay 15 elementos, todos son numeros de 6 digitos, quiza no me de a explicar bien, pero me resulta extrano, lo vuelvo a repetir si en mi condicional le digo que solo me guarde numeros de 6 digitos en mi array codici, aunque genere un numero distinto estoy usando una iteracion.

riccardo94 comentado Sep 5

es decir si tengo 15 iteraciones a disposicion y suponiendo que 10 de mi numeros generados por mi funcion combo no cumplen la condicion deberia de tener solo 5 numeros en mi pagina, esto se cumple, pero entonces porque en mi array tengo 15 elementos y todos son numeros de 6 digitos, no deberia de tener solo 5 elementos?

magarzon comentado Sep 6

No, cuenta bien, tu array tiene 14 elementos (los 10 que has puesto más otros 4 que dices que hay), y lo que te saca por pantalla también son 14 veces. De las 15 iteraciones, solo hay una que "falla", la cuarta, como ya te demostré antes, luego sigues añadiendo elementos al array, pero tú intentas mostrar siempre uno más de los que hay

riccardo94 comentado Sep 6

si es cierto en mi array hay 14 elementos, pero no entiendo bien una cosa, si en mi ciclo for le digo que cuente hasta 14
y que por cada iteracion le pido que se ejecute la funcion matematica random que genera un numero aleatorio de 6 digitos, porque entonces cuando genera un numero mayor o menor de 6 digitos no se pierde 1 iteracion

codici = [];
for(var x=0; x<15; x++) {
combo = math.randomInt(123456)
/
esta funcion segun la documentacion de mathJS me deberia generar un numero de 6 digitos sin embargo esto no es siempre asi
/
suponiendo que solo 5/15 me genera un numero de 6 digitos, en mi array deberia de tener solo 10 numeros(los 5 numeros generados no cumplen la condicion), sin embargo en mi array hay 14

if (combo.toString().length == 6) {
codici.push(combo)
document.getElementById("output").innerHTML += codici[x]+"<br>"
}

}

resumen: si tengo 15 iteraciones disponibiles, porque no se consume 1 iteracion cada vez que mi funcion matematica random no genera un numero de 6 digitos, o acaso cuando eso pasa no se cuenta?

riccardo94 comentado Sep 6

iteraciones = 15
entonces suponiendo que mi funcion matematica random genera 10 veces un numero de 6 digitos y 5 veces no, en mi array deberian de tener solo 9 elementos.
entonces porque tengo 14 elementos y todos son numeros de 6 digitos?

si la variable x se incrementa siempre, es decir si combo genera un numero de 6 digitos
x vale 1
si luego combo genera 5 codigos seguido de 7 digitos
x vale 6

y ahora me quedan solo 8 iteraciones, suponiendo que el resto de codigos que me genera combo son de 6 digitos, en total deberia de tener 9 codigos en mi array

riccardo94 comentado Sep 6

<div id="output"></div>
<button onclick="combinare()">start</button>

   <script type="text/javascript">
function combinare() {
        // body...

        codici = [];

            for(var x=0; x<10; x++){

                /*combo =  math.randomInt(999999)*/
                combo =  Math.floor((Math.random() * 1000000) + 1);

                if(combo.toString().length == 6) {

                codici.push(combo);

                document.getElementById('output').innerHTML += codici[x] + "<br>"

                    }

            }

        }
</script>

esto me devuelve en pantalla

656033

535997
677432
874251
734185
509669
976526
undefined
undefined

pero en mi array

Array [ 656033, 535997, 677432, 874251, 734185, 509669, 976526, 522141, 238540 ]

porque entonces cuando mi funcion random no genera un numero no resta 1 iteracion?

magarzon comentado Sep 6

Las iteraciones no se restan, al menos que tú le digas que lo hagas.

En este caso te ha pasado lo mismo que al inicio, lo que pasa es que en esta ocasión ha sido en la octava iteración donde ha generado un número de menos de 6 cifras.

riccardo94 comentado Sep 6

vale, pero entonces porque en mi array despues del octavo numero tengo un numero de 6 digitos? si mi funcion random falla ese numero no deberia estar ahi no crees?
si x se incrementa de cualquier manera, si la funcion random falla x se sigue incrementando, y pierdo una iteracion

riccardo94 comentado Sep 6

        codici = [];

            for(var x=0; x<5; x++){

                /*combo =  math.randomInt(999999)*/
                combo =  Math.floor((Math.random() * 1000000) + 1);

                if(combo.toString().length == 6) {

                codici.push(combo);

                document.getElementById('output').innerHTML += codici[x] + "<br>"

                    }

            }

        }
</script>

output

538574
249442
undefined
undefined

array
Array [ 538574, 249442, 934841, 155123 ]

suponiendo
x=0, combo 538574
x=1, combo 249442
x=2, combo ?????
x=3, combo ?????
x=4, combo ?????

porque en mi array hay esto?
Array [ 538574, 249442, 934841, 155123 ]

en mi array deberia de tenerlo asi
Array [538573, 249442, undefined, undefined]
o asi
Array [538573, 249442]

magarzon comentado Sep 6

No. Sigues sin entenderlo.
Tu array sigue creciendo con los números que sí cumplen la condición, pero como estás accediendo por un índice que ya no coincide con el nº de elementos de tu array, estás accediendo "fuera de límites" y por eso se muestra undefined

riccardo94 comentado Sep 7

acaso mi funcion math se puede repetir hasta generar un numero de 6 digitos y no consume los intentos es decir x no incrementa

                combo =  Math.floor((Math.random() * 1000000) + 1);

recorrido 1
x=0, combo 538574

recorrido 2
x=1, combo 249442

recorrido 3
x=2, combo ?????

recorrido 4
x=3, combo ?????

recorrido 5
x=4, combo ?????

entonces porque tengo en mi array 5 elementos si mi funcion random no genero un numero de 6 digitos en el recorrido 3,4 y 5

la unica explicacion para mi es que mi funcion random se ejecuta mas de 5 veces, pero es raro, si solo tengo 5 recorridos como es posible eso?

magarzon comentado Sep 7

Último intento, porque te lo he explicado ya 2 o 3 veces y no terminas de entenderlo.

Creo que te faltan fundamentos básicos de programación para entender algo tan básico como un bucle o un array, así que vamos a empezar por ahí.

La variable x del bucle for, se incrementa en cada iteración, a no ser que indiques lo contrario de alguna manera (no la incrementes si no se cumple una determinada condición, la decrementes si se cumple otra...), hasta que se cumple la condición de salida (por ejemplo x < 5).
Es decir, que si yo tengo for(x=0; x < 5; x++) {}, este bucle se va a ejecutar 5 veces, con los valores para x = 0,1,2,3 y 4.

Si solo quisiéramos aumentar el valor de x si se cumple una determinada condición, lo que habría que hacer es:

for(x = 1; x < 5;) {
   if (condicion_es_verdadera) {
     x++;
   }
}

En el ejemplo anterior, el bucle se puede repetir indefinidamente, hasta que se cumpla la condicion_verdadera 5 veces.

Ahora vamos con los arrays. Un array tiene un número de elementos asociados a un índice (En javascript y otros lenguajes, empezando por 0) 0, 1, 2,... o una clave (en este caso se suelen llamar mapas): 'a', 'b', 'c',...

En un array normal (con clave/índice numérico) si contiene 5 elementos, podrás acceder a ellos con los índices del 0 al 4: x[0], x[1], x[2],...

Si intentas acceder a un índice que no existe (en el caso de un array normal, por encima del número de elementos), por ejemplo al 6, x[6], en muchos lenguajes te va a saltar una excepción o dar un error, en javascript lo que te devuelve es un valor undefined. Es decir, como si tu array tuviera capacidad infinita, si intentas acceder a un índice que no tiene asignado valor, su valor por defecto es undefined.

Ahora vamos a mezclar los dos conceptos.
En tu problema, tienes un bucle que en cada iteración incrementa el valor de x. Tienes un array al que añades un elemento, PERO NO EN CADA ITERACIÓN, si no solo si se cumple una determinada condición (que el nº de dígitos del random sea 6). Es decir, que si en las 5 iteraciones solo generas 3 random que tengan 6 dígitos, tu array solo tendrá 3 elementos.
SIN EMBARGO, y ahí está el problema, para mostrar el nº random generado, en lugar de no incrementar el índice x, o de mostrar directamente el valor de combo, lo que haces es acceder al array en la posición x, PERO si en esa iteración el array no se ha incrementado, el índice x está por encima de la capacidad del array, y por tanto el valor es undefined.
Como te puse en mi respuesta, lo que pasa es esto:
x = 0. combo = 538574. array: [538574]. Muestras combo[0]: 538574
x = 1. combo = 249442. array: [538574, 249442]. Muestras combo[1]: 249442
x = 2. combo = ????. array: [538574, 249442]. Muestras combo[2]: undefined, porque array solo tiene valores en 0 y 1.
x = 3. combo = 123456 (por ejemplo). array: [538574, 249442, 123456]. Muestras combo[3]: undefined, porque array tiene ahora 0,1 y 2, pero no 3 (valor de x)
x = 4. combo = 654321 (por ejemplo). array: [538574, 249442, 123456, 654321]. Muestras combo[4]: undefined, porque array tiene ahora 0,1,2 y 3, pero no 4 (valor de x)

riccardo94 comentado Sep 7

tu mismo lo has dicho, "de alguna manera mi variable x no se incrementa si no se cumple la condicion" es esto que me resulta dificil de entender, si tengo solo 5 iteraciones disponibile en mi caso si random fallo 3 veces de 5 deberia de tener en mi array solo 2 elementos, sin embargo tengo 5

magarzon comentado Sep 7

Cómo sabes que tu array tiene 5 elementos?

riccardo94 comentado Sep 7

lo he verificado en la consola del navegador, puedes probar el script en tu navegador, yo utilizo firefox

magarzon comentado Sep 7

Demuéstramelo, haz una iteración de 5, y dame los 5 elementos del array que salen por consola

riccardo94 comentado Sep 7

puedes entrar en mi pc para que lo compruebes tu mismo, si aceptas te mando por privado mi id e pass de teamviewever

magarzon comentado Sep 7

No me digas que eres steven. No, no voy a perder más el tiempo. En todos los ejemplos que has puesto aquí tus arrays tienen menos elementos que iteraciones, así que estoy seguro que no es verdad, que si ejecutas 5 iteraciones, no tendrás 5 elementos (a no ser que las 5 den un resultado "bueno")

Peter comentado Sep 7

Hola @riccardo94 (steven), no hace falta que hagas usuarios nuevos, por favor utiliza tu primer usuario.

Saludos.

riccardo94 comentado Sep 7

no lo puedo usar, esta blockeado

Peter comentado Sep 7

Algo habrás hecho para que se bloquee la cuenta. La acabo de desbloquear.

Saludos.

magarzon comentado Sep 7

He probado (cambiando a 5 iteraciones para no hacerlo largo) 3 veces, esto son los resultados (escribiendo console.log(codici)):
[798537, 346395, 486558]
[868407, 781395, 497953, 934230]
[921532, 280009, 815177, 132360, 128104]

Por supuesto, en la última iteración el array sí tenía 5 elementos, eso puede pasar

riccardo94 comentado Sep 7

verificaste que en pantalla te arroja numeros undefined y en el array son todos numeros de 6 digitos

riccardo94 comentado Sep 7

si pero eso no deberia pasar no crees tu

magarzon comentado Sep 7

Sí, DEBE PASAR POR LO QUE YA TE HE EXPLICADO COMO 4 VECES.
Acabo de ejecutar de nuevo, y te explico con mi resultado lo que ha pasado.
Por pantalla ha salido esto:
564069
974343
undefined
undefined

Y haciendo un console.log(codici) AL FINAL DE LA EJECUCIÓN, sale esto:
[564069, 974343, 566677, 328016]

Qué ha pasado? Lo siguiente:
x = 0, combo = 564069, codici[564069], como cumple la condición, muestro por pantalla codici[x], es decir, codici[0] => 564069
x = 1, combo = 974343, codici[564069, 974343], como cumple la condición, muestro por pantalla codici[x], es decir, codici[1] => 974343
x = 2, combo = ??? no sabemos cuál, PORQUE NO SE MUESTRA POR PANTALLA, AL NO CUMPLIR LA CONDICIÓN. codici permanece inalterado, [564069, 974343]
x = 3, combo = 566677, codici = [564069, 974343, 566677]. Y como se cumple la condición, voy a sacar por pantalla codici[x], PERO COMO X = 3 Y EL ARRAY SOLO VA DE 0 A 2 EN ESTE MOMENTO, MUESTRO UNDEFINED
x = 4, combo = 328016, codici = [564069, 974343, 566677, 328016]. Y como se cumple la condición, voy a sacar por pantalla codici[x], Y PASA LO MISMO DE ANTES, VOY A INTENTAR MOSTRAR CODICI[4], PERO EL ARRAY SOLO TIENE DE 0 A 3, POR LO QUE VUELVO A MOSTRAR UNDEFINED

riccardo94 comentado Sep 7

ahora si tiene mas sentido, gracias, lo que pasaba antes no se si fue error del navegador, era que si tenia 5 iteraciones, en pantalla devolvia 5 numeros, de los cual 2 eran undefined, y en mi array tambian habia 5 elementos, no me explicaba si en algun momento random se equivoco y no cumplio la condicion mi array deberia de tener 4, porque en una iteracion random no cumplio la condicion, sin embargo en mi array habian 5 elementos, y por pantalla 5 numeros, ahora ya no tengo ese error, si en pantalla tengo 5 numeros y 1 de ellos es undefined, en mi array tengo 4 elementos como deberia de ser, porque consumi 1 iteracion cuando random no cumplio la condicion

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta