[Javascript] Hilo General

Ranthas

Type coercion en 2021, mamasita

Kaledros

Viva el dynamic typing XD

isvidal

#120 Eso no es cierto

1 respuesta
Helzid

#123 Sí.

1 respuesta
isvidal

#124 Que no.

El compilador se pregunta es 1 mas peque;o que 2?

Es decir es null mas peque;o que 0?

No no lo es.

Y aqui acaba ya, por motivos de optimizacion si el primero no es mas peque;o que el segundo directamente devuelve true.

Porque si el primero no es mas peque;o, quiere decir que tiene que ser o igual o mas grande por cojones.

Es decir, nunca llega a comparar si es igual o mas grande, solo comprueba si es mas peque;o, y como es false, es que las otras tienen que ser true por cojones (Aunque realmente no lo sean, porque null no es un numero)

pd: Tienes razon y null y se convierte a +0 (Que no 0) pero la razon por la que se resuelve true es por la expuesta aqui arriba.

26 días después
widim

Buenas, estoy atascado con algo que aparentemente debería ser simple, pero que no encuentro la solución correcta, como última opción podría hacerlo yo "a mano", pero algo debe haber que me solucione este problema.

Tengo dos arrays:

[5, 10, 80, 500.....]
[] // vacío

Básicamente voy extrayendo valores aleatorios del primer array y añadiéndolos al segundo. El problema es que no sé exactamente cómo extraer el valor en cuestión del array sin joder los demás.

Podría hacer un delete arr[arr.indexOf(value)] y tan pancho, pero es un follón comerme los undefined cuando el array quede vacío.

Lo más recomendable creo que es usar el .splice, ya que reindexa automáticamente, pero no consigo hacerlo funcionar correctamente. Me cargo el 90% de los items del array al extraer el primer valor.

A ver si podéis echarme una mano. Gracias!

3 respuestas
TheBrotha

#126 es tan facil como hacer arr.splice( index, items) donde index es el punto de inicio e items cuantos elementos vas a querer borrar a partir de dicho punto. Si te esta dando problemas es porque seguramente estes guardando en una variable el arr.splice, eso no funciona así, cuando lo asignas a una variable te devuelve el valor que esta eliminando, no el array modificado.

1
isvidal

#126 Si el n(o) no es un problema con un filter lo sacas y pista

// inicio

const numberToFind = 300

const arrayWithNumbers = [1,50,20,300]
const arrayEmpty = []

const index = arrayWithNumbers.findIndex(n => n === numberToFind)

if(index === -1) {
return;
}

arrayEmpty.push(arrayWithNumbers[index])

const arrayWithNumbersFiltered = arrayWithNumbers.filter((_, i) => i !== index)

// fin

2 2 respuestas
B

#128 ¿Sueles usar python no? ... Lo digo por los ";"...

Otra posible solución, si te manejas con elementos no duplicados:

const lerele = new Set([5, 10, 80, 500]);
lerele.delete(80);
1 1 respuesta
EnderFX

#126

let arrayWithNumbers = [1,50,20,300];
const randomArray  = [];

while(arrayWithNumbers.length) {
  const n = parseInt(Math.random() * arrayWithNumbers.length);
  randomArray.push(arrayWithNumbers.splice(n, 1)[0]);
}

Si quieres conservar el array original, puedes hacerte una copia y operar sobre ella.
Si no quieres tocar el original y no te vale hacer una copia, necesitarás llevar la cuenta de qué índices has utilizado ya para no volver a incluirlos en el segundo array.

1 1 respuesta
widim

Gracias a todos. Lo primero, perdón porque estoy empezando y muchas cosas no las entiendo (tengo que darle unas cuantas vueltas al código de #128 porque no me he enterado demasiado XD y no quiero copypastear y ya, aún no controlo el .map, .filter, .reduce)

Lo he rehecho con un Set, como dice #129 y ya he conseguido lo que quería, dejo el link por si tenéis alguna sugerencia:

http://jsitor.com/F_Rdai-Iu_

Y aquí dejo el código original que no me funciona, por si queréis echarle un vistazo y quizá encontrais el fallo:

http://jsitor.com/6DubNOg5Co

Y voy a intentar ahora implementar la solución de #130

1 respuesta
EnderFX

#131

  colors.splice(colors.indexOf(random, 0));

Estás haciendo indexOf(random, 0), cuando quieres hacer indexOf(random), y con eso, hacer colors.splice(X, 0).
En cualquier caso, <Array>.splice(X, 0) quiere decir "elimina 0 elementos en el índice X, y añade <nada>", ergo no estarías modificando el array tampoco.
Docs MDN de splice.

Cambia esa línea por la siguiente:

  colors.splice(colors.indexOf(random), 1);

Y debería funcionar bien.

PD: Si quieres hacerlo con mi solución, tendrías que hacer lo que estoy haciendo dentro del while en tu click event listener. Puedes eliminar el while, y lo que tendrías que añadir para que funcione igual es un if: si el array original está vacío (arrayWithNumbers en mi caso, colors en el tuyo), puedes invertir los valores como haces tú con algo así:

if (!arrayWithNumbers.length) {
  arrayWithNumbers.push(...randomArray);
  randomArray.splice(0, randomArray.length);
}

O si quieres hacerlo con variables en lugar de constantes (let en lugar de const), puedes hacer simplemente:

if (!arrayWithNumbers.length) {
  arrayWithNumbers = randomArray;  // Está bien, pero ojo, estás re-utilizando la referencia anterior, no creando un nuevo array.
  randomArray = [];
}
EnderFX

Por último, y perdón por el doble post, espero que seas consciente de que tanto getRandomColor como setRandomColor, en tu código, son closures que están guardando referencias a colors y colorsUsed, variables definidas fuera de dichas funciones (y no en su scope).

Esto no es malo, es una práctica habitual, pero conviene que lo tengas en mente y sepas cuándo usarlas, cuándo no, y cuándo algo te está petando por estar capturando un valor de un scope exterior a una función: https://developer.mozilla.org/es/docs/Web/JavaScript/Closures.

isvidal

VIendo estas cosas nuevas me apiado de todos aquellos que tenian que programar en JS hace a;os

https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver

Una cosa tan sencilla como ver si un elemento del dom ha cambiado de tama;o/posicion hoy es trivial, antes un dolor de muelas

Lo peor de todo, es que apis como estas tan nuevas, NO SALEN, en la mayoria de respuestas de Stack Overfloy legacy, asi que buscas una solucion para tu problema y es dificil llegar a ella solo a base de stack overflow.

3 2 respuestas
B

#134 Yo por eso siempre recomiendo leer el blog oficial de "chrome dev": https://developer.chrome.com/blog/

Otras cosas me entero porque hago extensiones de navegador y al pasar "web-ext" me canta los deprecated, y nueva documentación para hacer las cosas... además de que la docu en internet para el tema de extensiones suele estar más modernizada que si vas buscando por el camino "normal".

VonRundstedt

#134 Justo hoy estaba liado con esto y el window.innerWidth, debo leer más el foro dev D:

20 días después
widim

Buenas, me paso por aquí de nuevo a dar la lata.

Estoy teniendo problemas para comprender las promesas. Entiendo todo lo que tiene que ver con la sincronía, la asincronía, cómo trabaja JS con el navegador/otros entornos para las tareas asíncronas, cómo ayudan las promesas a paliar el callback hell etc. pero aún así, estas últimas no terminan de hacerme click en la cabeza. No termino de comprender cómo usarlas en un proyecto.

Si alguien me puede pasar alguna guía o ejemplos para retards, lo agradezco. Lo he intentado con el MDN y una guía de node pero nada macho, no me entra en la cabeza.

Gracias.

3 respuestas
B

.

4 1 respuesta
widim

#138 Ese es el problema, que no sé exactamente que es lo que no me cuadra. Ojalá pudiese responderte, en ese caso seguramente no tendría que haber hecho esta pregunta de mierda xD

El caso es que lo único que te puedo responder es que no terminan de hacerme click, por alguna razón X. Por eso quería saber si sabéis de alguna guía buena que explique bien esto a ver si consigue sacarme del bloqueo.

1 respuesta
Helzid

#139 mírate esto a ver:

https://exploringjs.com/impatient-js/ch_promises.html#the-basics-of-using-promises

1
isvidal

#137 Que existan no quiere decir que las tengas que usar en todos lados.

Basicamente, en un contexto normal de pagina web, se usan para fetches y tal, y ya.

const getData = async () => {
  const response = await fetch('items/api');
  if(response.ok) {
   //fiesta
  }
}
B

#137 Las promesas se las lleva el viento...

Mientras no sea modificar el DOM, lo puedes usar para lo que te de la gana (que si quieres puedes tocar el DOM, pero si puedes evitarlo mejor)...

La idea de las promesas es facilitar el trabajo asincrono, y la idea de usar asincronia es la de no bloquear el bucle principal. Lo usarás siempre que te encuentres consumiendo mucho tiempo del bucle principal (con mucho tiempo hablo de milisegundos).

Luego tienes Task vs MicroTask vs RAF. La diferencia puede resultar sutil, pero básicamente radica en la prioridad de las tareas encoladas (entre otras cosas).
Ya te dejo a ti y a tus ganas de querer saber más el saber más del tema... si necesitas algo ya sabes.

2 meses después
B

Hola, estoy empezando en Javascript y creo que no me está llendo muy bien xD

Cada vez que quiero recargar la consola en vscode porque he escrito algo nuevo tengo que escribir cd js (la carpeta) y luego node main.js (el nombre del archivo), no sé si esto es habitual.

Lo que escribo parece funcionar en la consola de vscode pero luego en la consola de chrome no me aparece nada

He instalado y desinstalado Node.js y me sigue pasando lo mismo, creo que hay algo que no está bien instalado pero no tengo ni idea de como funciona nada de esto xd

1 respuesta
screechie

#143 ¿has linkeado el script en el html?

1 respuesta
B

#144 Si

2 respuestas
B

#145 muestra que tienes en el html

screechie

#145 He hecho tu mismo ejemplo y me funciona tanto en navegador como node. Estoy seguro que el fallo lo tienes en el punto de entrada (html).

1
B

No estoy en casa, luego lo miro pero dudo que sea eso.

Yo creo que es algo que no se me instala bien con el Node porque tampoco me reconoce el PHP.

1 respuesta
isvidal

#148 Tienes un lio bastante gordo de conceptos.

El navegador no tiene nada que ver con node. Y php no tiene nada que ver con node.

Si el fichero que abres, el navegador no te lo ejecuta (el javascript en el html) es que algo tienes mal en el html.

1 respuesta
B

#149 Sí perdón, el PHP lo descargué con el link de la web y tampoco me iba