This graph shows how many times the word ______ has been mentioned throughout the history of the program.
Si queréis, lo miramos. Alguien decÃa que le estaba costando este, que es el layer.
En la fábrica de Papá Noel se acerca el dÃa especial y todavÃa tenemos un montón de cosas por contar.
Por suerte, a Mark Zuck de Elf se le ha ocurrido... Anda, qué gracioso este chico.
Se le ha ocurrido crear una función que permite agrupar un array que puede ser de valores u objetos.
Muy bien, valores u objetos. Voy a poner esto pequeñito.
A través de una función o de una propiedad.
Nos trae un montón de ejemplos. Está bastante bien que tenga un montón de ejemplos para que no se equivoquéis.
Por ejemplo, lo que hay que hacer es agrupar.
Y lo que dice es que tú tienes un array de elementos, en este caso son números,
y hay que ejecutar con este método y dependiendo de lo que devuelva hay que agruparlo en un aquÃ.
Por ejemplo, este número 6, cuando se le pasa al mathflor, quedarÃa en 6.
Y el 4.2 quedarÃa en 4 y el 6.3 quedarÃa en 6.
Y entonces los que han quedado en 6 se agrupan aquà y los que han quedado con 4 se agruparÃan aquÃ.
Ahora, lo interesante de esta función en realidad es que aparte de pasarle una función,
como hemos dicho por aquÃ, a través de una función o de una propiedad.
Por ejemplo, esto serÃa la propiedad length.
Esto quiere decir que en el array este tendrÃamos el one de length tiene 3 letras,
el two tiene 3 letras y este tiene 5 letras.
Bueno, pues serÃa un objeto donde el 3, que es el length que tendrÃa one y two,
pues están ahà agrupados y el 5 el three.
O sea, me parece un ejercicio muy, muy, no sé, no es muy difÃcil, pero es curioso.
Porque además es útil, que es una de las cosas que a mà normalmente los retos no me suelen gustar.
Pero esto es una cosa que te puedes encontrar realmente en la vida real.
Aquà lo tendrÃamos con una función también.
En cada una le pasas el timestamp y aquà lo que tienes que recuperar es el año.
Y aquà tendrÃas que este es del 2014 y este es del 2013.
No es que me lo sepa de memoria, sino que está aquà el resultado.
Y aquà lo mismo con un array de objetos que los tienes que agrupar por routing
y entonces quedan agrupados los que tienen 8, los que tienen 9 y los que tienen 10.
¿Vale? ¿S� ¿Está aqu� ¿Bien? ¿S� ¿S� ¿S�
Bueno, a ver, vamos a hacer yo cómo lo harÃa, luego lo podrÃa optimizar y tal.
Pero yo pensando sobre esto, una cosa que empezarÃa...
Ah, bueno, voy a terminar de leer denunciado, importante.
Como ves, la función groupby recibe una colección array.
¿Vale? Todos reciben siempre un array.
Y luego una función o propiedad.
Y devuelvo un objeto con claves que son los valores de la función ejecutada
pasando como argumento cada elemento o de la propiedad por cada elemento.
O sea, puede ser la función, que es esto, o la propiedad, que es esto y que es esto.
¿Vale?
Luego los valores son un array de los valores que tengan la misma llave.
La dificultad del reto está más en comprender la función que la implementación.
Ya veremos que la implementación es bastante sencilla.
Pero lo que puede costar es entender cómo se agrupa, por qué se agrupa y todo esto.
Entonces, yo lo que empezarÃa es creando un objeto y devolviendo un objeto.
¿Vale?
Esto, seguro.
Entonces ya el test se me va quejando, ¿no?
Dice, este array con matflor deberÃa ejecutar no sé qué, no sé cuánto.
¿Vale?
Me dice, deberÃa ejecutar esto.
Esto es lo que me deberÃa devolver.
Bueno, ya sé que he empezado mal.
Asà que lo que podrÃamos empezar es hacer un for off.
¿Vale?
For.
Hay diferentes formas de hacerlo.
Yo voy a hacerlo con un for off.
Si lo preferÃs hacer con otra cosa, lo hacéis con otra cosa.
Y con esto, lo que tenemos que diferenciar serÃa la propiedad que tenemos que aplicar aquÃ.
Asà que lo que vamos a hacer es tener la prop.
Bueno, la prop va a ser si es una función.
Vamos a hacer aquÃ.
Le vamos a llamar prop para ver si es una función o es la propiedad.
¿Cómo vamos a hacer esto?
¿Ves que aquà te aparece values y iterat�
Se llama iteratà porque es lo que se ejecuta para cada elemento.
Entonces, lo que tenemos que mirar es que si el iteratà en realidad es una función o no es una función.
Lo voy a poner aquÃ, luego lo podemos optimizar.
Pero ahora mismo podemos mirar el type of del iteratà y miramos aquÃ.
Si es una function, ¿vale?
Pues si es una function, lo que tenemos que hacer con esto es iteratÃ, iteratÃ, value.
¿Vale?
Y si no, lo que tendrÃamos que hacer es de cada uno de los values, ¿vale?
Con esto que estamos haciendo, const value of values.
En este caso serÃa el primer valor, el siguiente valor y el siguiente valor del array.
Pues tendrÃamos que acceder a la propiedad.
Porque esas son las dos opciones.
O es un método o es una propiedad.
Asà que yo harÃa esto por aquÃ.
Esto por un lado.
Ya tendrÃamos como la prop, ¿no?
Ahora, deberÃamos mirar si la prop está ya en el objeto.
Que en el caso de este, pues obviamente al principio no estará.
Tenemos que mirar si prop está en el objeto.
Le podemos llamar prop o le podemos llamar key.
Creo que key puede quedar un poco mejor, ¿vale?
Si la key está en el objeto, por lo que deberÃamos hacer serÃa simplemente object key.push value.
¿Vale?
Y si no, lo que deberÃamos hacer, pues...
A ver, esto es un poco chungui.
No chungui, pero para simplificarlo y no poner un if, lo que vamos a hacer es simplemente asignarlo.
Le ponemos en el objeto, en la key, ¿vale?
Le hacemos la asignación de justamente un array que tenga el value.
Y con esto, mira, ya está, ya han pasado los test.
Ahora, esto se podrÃa mejorar, ¿vale?
Porque, a ver, se podrÃa mejorar al menos dándole mejores nombres.
¿Qué es lo que hemos hecho?
Volviendo otra vez.
Hemos creado un objeto vacÃo.
Luego, estamos iterando aquà cada uno de los valores del array, de los valores que se le pasa.
Por ejemplo, vamos a poner este ejemplo, 6.1, 4.2, 6.3, ¿vale?
Pues lo que estamos haciendo aquÃ, con el primero, el 6.1, lo tenemos aquà como value.
Miramos si el atirati, este es una función.
Si es una función, la ejecutamos con este valor.
O sea, estarÃamos ejecutando mathflor con el 6.1.
Y esto lo que nos devuelve es justamente la key, que serÃa el 6.
Miramos si este key existe en el objeto.
Si existe en el objeto, lo que hacemos es simplemente un push.
¿Por qué?
Porque si existe, ya tenemos aquà un array.
Asà que lo que hacemos es un push de este nuevo valor.
Y si no, lo que hacemos es crear esta key, ¿vale?
Porque imagÃnate que este objeto todavÃa no tiene esta key.
Creamosla aquà y le asignamos un array que ya tenga el primer valor, que en este caso serÃa el 6.1, ¿vale?
Y con esto ya lo tendrÃamos.
Lo difÃcil, o sea, lo complicado que tendrÃamos, a ver, asegurarnos que estamos haciendo este if,
porque si aquÃ, por lo que sea, hacemos esto y solo tenemos en cuenta las funciones.
A ver, iterative value.
Me dice que no es correcto directamente.
Pensaba que a lo mejor no.
Si es un...
Claro, es que al final iterative value.
Si hacemos esto, igual es con esto no peta.
Con esto no petará.
Vale.
¿Ves?
Si solo haces esto, ¿por qué no tiene en cuenta?
Claro, porque aquà no estoy teniendo en cuenta que el iterative puede ser una función.
Y si esto no lo tengo en cuenta, no va a pasar los test, obviamente.
Y también, si hacemos al revés y no miramos que sea una función y la ejecutamos sin más,
pues va a petar, ¿vale?
Va a petar porque es que pone el código no parece correcto.
Seguramente porque el iterative este está intentando ejecutar la función y no es una función,
porque ya hemos visto que a veces puede ser un string que es la propiedad que debes buscar.
Pues eso.
Esta podrÃa ser una forma, a ver, si la queréis hacer un poco más entendible,
podéis utilizar un if aquÃ, en lugar de hacer esto.
O incluso este tipo de asignación, esta asignación que se hace aquÃ, la podéis hacer fuera.
Yo qué sé, podrÃais hacer algo asÃ, como mirar si existe.
Y si existe se le ponga esto y entonces directamente esto lo podéis hacer asà también.
Y le pusheáis este valor directamente.
Un poquito más fácil.
O sea, el hecho de que solo hace la asignación del array, en el caso de que no exista,
y luego le hace el push.
Asà lo simplificáis, le quitáis el condicional y ya está.
Hay diferentes formas, lo que os guste más.
Además, este check también lo podéis hacer fuera.
En lugar de hacerlo en cada iteración, que a lo mejor no tiene sentido,
podéis mirar aquà si is function, lo podéis poner aquà fuera,
y luego aquà solo tenéis que hacer esto.
Entonces, bueno, os quitáis ese check, os lo quitáis de fuera.
O sea, lo quitáis de dentro, en lugar de hacerlo en cada iteración,
el type of, type of y type of.
Y tampoco que tenga un coste seguramente muy grande,
pero bueno, es una posible optimización.
Lo podéis quitar fuera y asà tenéis ya aquà un boleano.
Solo miráis el boleano y lo utilizáis y ya tenéislo aquÃ, por aquÃ.
Y hombre, queda bastante limpio y fácil.
Lo que pasa es que es eso, es lo que hemos dicho,
que hay que entenderlo, ¿no?
Hay que entender hacer este condicional aquÃ.
Yo creo que este condicional es el más importante
para diferenciar entre la función o la propiedad.
Y ya está, ya está.
Con esto ya estarÃa.
Asà de simple y sencillo, como lo habéis visto.
A mà no me costó mucho,
pero asà veo que hay otra manera más eficiente o algo asÃ.
Bueno, sÃ.