JavaScript - splice que no elimina el contenido del Array

 
Vista:
sin imagen de perfil
Val: 16
Ha aumentado su posición en 4 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

splice que no elimina el contenido del Array

Publicado por jearj (9 intervenciones) el 18/05/2017 09:19:04
La idea es que se elimine el numero generado del Array num, que actúa de números disponibles, para que de ese modo no pueda repetir nunca el mismo numero.

El caso es que no consigo que deje de repetir los números del 1 al 9.


1
2
3
4
5
6
7
8
9
10
11
12
generarNumeroAleatorio: function() {
var num =[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
var indice = Math.floor(Math.random()*num.length);
var n = num.indexOf(indice);
var n = num[indice];
num.splice(indice, 1);
        if(n < 10){
            n = "0" + n.toString();
        }
        console.log('Numero generado: ' + n.toString());
        return n.toString();
    },

No soy muy bueno con el js, necesito ayuda por favor.

Saludos y Gracias por leerme.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de [abZeroX]
Val: 477
Bronce
Ha mantenido su posición en JavaScript (en relación al último mes)
Gráfica de JavaScript

splice que no elimina el contenido del Array

Publicado por [abZeroX] (130 intervenciones) el 19/05/2017 00:02:51
Hola, prueba con esto;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function generarNumeroAleatorio() {
    var numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
 
    // genero el número aleatorio
    var num = Math.floor( (Math.random() * numbers.length) + 1);
 
    // recupero el número en el indice generado
    var index = numbers.indexOf(num);
 
    // elimino el número del array
    numbers.splice(index, 1);
 
    num = (num < 10) ? '0' + num : num;
 
    console.log('Número eliminado: ' + num);
    console.log('Indice del número eliminado: ' + index);
    console.log(numbers);
}
 
generarNumeroAleatorio();

Nos comentas si el lo que buscabas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 16
Ha aumentado su posición en 4 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

splice que no elimina el contenido del Array

Publicado por jearj (9 intervenciones) el 19/05/2017 09:57:51
Gracias abZeroX

Lo que has puesto se encaja bien pero sigue repitiendo las unidades (del 1 al 9)

La causa es esta parte:
1
num = (num < 10) ? '0' + num : num;

He intentado que extraiga todos los números del array numbers, pero en el momento que elimino dicha línea el método deja de funcionar.

es lo mismo que me ocurre con el if:
1
2
3
if(n < 10){
    n = "0" + n.toString();
}

Un saludo

Jose
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de [abZeroX]
Val: 477
Bronce
Ha mantenido su posición en JavaScript (en relación al último mes)
Gráfica de JavaScript

splice que no elimina el contenido del Array

Publicado por [abZeroX] (130 intervenciones) el 19/05/2017 22:55:03
Hola Jose, no entiendo cual es tu idea, el script que te compartí lo que hace es generar un número aleatorio el cual representa un valor valido del array, luego con el método indexOf recupero el indice que ocupa dicho elemento en el array para luego quitarlo del arreglo utilizando el método slice. Por ultimo simplemente muestro el array modificado y el número e indice eliminado.

La linea
1
num = (num < 10) ? '0' + num : num;
simplemente evalúa si el número es menor que 10 agrega un cero delante de lo contrario mantiene el número tal cual.

No esto seguro si esta es tu idea.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 16
Ha aumentado su posición en 4 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

splice que no elimina el contenido del Array

Publicado por jearj (9 intervenciones) el 20/05/2017 11:33:56
La idea es esa que has comentado (Extraer los números del array num y eliminarlos para que no vuelva a extraer el mismo numero)
Lo que ocurre es, que sigue extrayendo unidades aunque ya hayan salido.
¿No hay forma de suprimir esto?

num = (num < 10) ? '0' + num : num;

El caso es que a medida que quedan menos números las unidades se repiten mas y mas.

Es como si el splice no eliminara las unidades, debido a que pasan por esta línea: num = (num < 10) ? '0' + num : num;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de [abZeroX]
Val: 477
Bronce
Ha mantenido su posición en JavaScript (en relación al último mes)
Gráfica de JavaScript

splice que no elimina el contenido del Array

Publicado por [abZeroX] (130 intervenciones) el 21/05/2017 03:27:30
El problema que como esta realizado el código siempre que se llama a la función se crea nuevamente el array y por ende lo números que fueron eliminados no tienen relevancia alguna.
He mejorado el código. Ahora el array esta definido por fuera de la función, al llamar a dicha función en primer lugar se comprueba que el array aun tenga elementos.

En caso de cumplirse se genera un número aleatorio entre 1 y el máximo número de array (en este caso siempre será el ultimo de éste).
1
var num = Math.floor( (Math.random() * numbers[numbers.length - 1]) + 1);

Luego pregunto por el indice que ocupa el valor en el array.
1
var index = numbers.indexOf(num);

En caso de que el elemento no exista en el array el metodo indexOf devuelve -1 por lo tanto ejecuto nuevamente la función hasta lograr eliminar un elemento del array.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
 
    /**
     * generarNumeroAleatorio
     * @return {Boolean|Number} 
     */
    function generarNumeroAleatorio() {
        if (numbers.length > 0) {
            // genero el número aleatorio
            var num = Math.floor( (Math.random() * numbers[numbers.length - 1]) + 1);
 
            // recupero el indice el del número generado
            var index = numbers.indexOf(num);
 
            // ejecuto nuevamente la función si el número no existe
            if (index === -1) {
                generarNumeroAleatorio();
            } else {
                // elimino el número del array
                numbers.splice(index, 1);
            }
 
            console.log(numbers);
            return num;
        }
        return false;
    }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 16
Ha aumentado su posición en 4 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

splice que no elimina el contenido del Array

Publicado por jearj (9 intervenciones) el 21/05/2017 11:05:15
Ese ultimo método no funciona en el sistema.

Te dejo el sistema completo para que tengas mejor visión.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
var Bingo = {
    min: 01,
    max: 90,
    numerosSorteados: new Array(),
    windowDocument: null,
 
    init: function(parent){
        this.windowDocument = parent;
        this.bind();
    },
 
    bind: function(){
        $("#boton-borrar-todo").click(function(){
            Bingo.botonBorrarTodoAction();
        });
        $("#boton-jugar").click(function(){
            Bingo.botonJugarAction();
        });
        $(".texto").click(function(){
            Bingo.seleccionarTipoJuego(this);
        });
        $("#boton-sortear").click(function(){
            Bingo.jugar();
        });
    },
 
    seleccionarTipoJuego: function(boton){
        if(!$(boton).hasClass( "texto-seleccionado" )){
            $(boton).addClass('texto-seleccionado', 1000, 'easeOutQuart');
            var aux = $(boton).attr('id');
            switch(aux){
                case 'boton-terna':
                    $('#boton-linea').removeClass('texto-seleccionado', 500, 'easeOutQuart');
                    $('#boton-bingo').removeClass('texto-seleccionado', 500, 'easeOutQuart');
                    break;
                case 'boton-linea':
                    $('#boton-terna').removeClass('texto-seleccionado', 500, 'easeOutQuart');
                    $('#boton-bingo').removeClass('texto-seleccionado', 500, 'easeOutQuart');
                    break;
                case 'boton-bingo':
                    $('#boton-terna').removeClass('texto-seleccionado', 500, 'easeOutQuart');
                    $('#boton-linea').removeClass('texto-seleccionado', 500, 'easeOutQuart');
                    break;
            }
        } else {
            $(boton).removeClass('texto-seleccionado', 1000, 'easeOutQuart');
        }
    },
 
    botonBorrarTodoAction: function(){
        window.top.location.reload();
    },
 
    botonJugarAction: function(){
        bootbox.dialog({
            message: "<p>Quiere activar<br/>el modo automatico</p>",
            title: "",
            buttons: {
                danger: {
                    label: "No",
                    className: "btn-danger",
                    callback: function() {
 
                    }
                },
                main: {
                    label: "Si",
                    className: "btn-primary",
                    callback: function() {
                        bootbox.hideAll();
                        Bingo.numerosSorteados = new Array();
var milisegundos = 3000;
var x = 0;
$(document).ready(function() {
$(":button#start").bind("click", function() {
timer = setInterval('Bingo.jugar()', milisegundos);
});
$(":button#stop").bind("click", function() {
timer = clearInterval(timer);
});
});
                        Bingo.jugar();
                    }
                }
            }
        });
    },
 
    anularBola: function(numero){
        $('#bola-actual').html('-');
        $('#bola-salio-'+numero).remove();
        $('#bola-'+numero).removeClass('wp-pagenavi-span-bola-salio');
        $('#bola-'+numero).addClass('wp-pagenavi-span');
    },
 
    seleccionarBolaAction: function(bola){
        if(bola.hasClass( "wp-pagenavi-span-bola-salio" )){
            console.log("La bola seleccionada YA SALIO!");
        }
        else{
            var n = bola.html();
            console.log('Numero marcado: ' + n);
            this.generarBolaGigante(n);
            this.marcarBolaYaSalio(bola);
            this.numerosSorteados.push(n);
            console.log(this.numerosSorteados);
        }
    },
 
    marcarBolaYaSalio: function(bola){
        bola.addClass('wp-pagenavi-span-bola-salio', 2500, 'easeOutExpo',
            function(){
                bola.removeClass('wp-pagenavi-span');
                var numero = bola.html();
                $('#bola-actual-flotante').remove();
                $('#ultimas-6').prepend('<span class="wp-pagenavi-span-bola-salio" onclick="Bingo.anularBola(\''+numero+'\');" id="bola-salio-'+numero+'">'+numero+'</span>');
            }
        );
    },
 
    generarBolaGigante: function(numero){
        $('#bola-actual').html(numero);
        $( window.document.body ).prepend('<span class="bola-actual-flotante" id="bola-actual-flotante">'+numero+'</span>');
        $( ".bola-actual-flotante" ).position({
            of: $('#left-content')
        });
    },
 
    generarNumeroAleatorio: function() {
	var numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90];
        var n = Math.floor( (Math.random() * numbers.length) + 1);
	var index = numbers.indexOf(n);
	numbers.splice(index, 1);
 
	n = (n < 10) ? '0' + n : n;
 
        console.log('Número eliminado: ' + n);
        console.log('Indice del número eliminado: ' + index);
        console.log(numbers);
        console.log('Numero generado: ' + n.toString());
            document.all.sound.src = n +'.mp3';
            console.log('Mi audio es '+n+'.mp3');
	return n.toString();
    },
 
    jugar: function(){
        console.log(_.size(Bingo.numerosSorteados));
        if(_.size(Bingo.numerosSorteados) >= (Bingo.max)){
            Bingo.showMensajeJuegoFinalizado();
            return;
        }
        var n = Bingo.generarNumeroAleatorio();
        if(_.contains(Bingo.numerosSorteados, n)){
            // controlar que aqui si ya tiene todos los numeros no genere infinitamente
            console.log('Numero sorteado ya salio: ' + n);
            Bingo.jugar();
        }
        else{
            Bingo.seleccionarBolaAction($('#bola-' + n));
        }
    },
 
    showMensajeJuegoFinalizado: function(){
        bootbox.dialog({
            message: "<p>Todos los números ya fueron sorteados.<br/>Desea LIMPIAR la pizarra?</p>",
            title: "El Juego a finalizado",
            buttons: {
                danger: {
                    label: "No",
                    className: "btn-danger",
                    callback: function() {
 
                    }
                },
                main: {
                    label: "Si, limpiar",
                    className: "btn-primary",
                    callback: function() {
                        bootbox.hideAll();
                        Bingo.botonBorrarTodoAction();
                    }
                }
            }
        });
    }
};
 
$( window.document ).ready(function() {
    Bingo.init(this);
});

Muchas Gracias por lo que estas haciendo.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar