.
Como lo he mencionado en clases anteriores, este comentario tiene como propósito el que no te auto-spoiles con la soluciones de la comunidad (lo cual no tiene absolutamente NADA de malo el compartir tus soluciones) pero queremos que la comunidad tenga la mejor experiencia si es su primera vez en ejercicios de este estilo (sigan compartiendo soluciones alternativas y feedback pls). El otro propósito de este comentario es explicarte a detalle la solución del playground.
.
Pero antes, un gif random, bajo tu propio riesgo puedes ver la solución a este problema, si no lo deseas simplemente no des click en "Mostrar más"
!michi
.
Explicación
Ahora sí, vamos a explicarte la solución a este no tan sencillo problema
exportfunctionfindFamousCats(cats){// Creamos un objeto en el cual guardaremos los nombres// de los gatitos y el número máximo de seguidoreslet famousStats ={// El array de nombres empieza vacíocatNames:[],// Y el número máximo de seguidores en 0maxNumOfFollowers:0,};for(let i =0; i < cats.length; i++){// Iteramos por cada gatito recibido en el arrayconst cat = cats[i];// Obtenemos la suma total de seguidores con reduceconst totalFollowers = cat.followers.reduce((acum, currentVal)=> acum + currentVal,0);// comparamos si el total de followers del actual gatito es IGUAL// al del objeto que declaramos al inicioif(totalFollowers === famousStats.maxNumOfFollowers){// De ser así, solo agregamos el nombre del gatito famousStats.catNames.push(cat.name);}// Por otro lado, si es MAYORif(totalFollowers > famousStats.maxNumOfFollowers){// Reiniciamos el array de nombres famousStats.catNames=[];// Agregamos a nuestro gatito influencer famousStats.catNames.push(cat.name);// Para al final asignar el número máximo de seguidores// a la debida propiedad del objeto famousStats.maxNumOfFollowers= totalFollowers;}}// Al final solo retornamos LOS NOMBRESreturn famousStats.catNames;}
.
Y así es como ayudamos a los michis a no pelearse por ser influencers.
.
¿Cómo resolviste tu este problema?
Linea anti spoiler
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ahora si en este punto me atore, pude lograr sin problemas el ejercicio del curso de Java Basico pero este no :'(
tengo una duda que espero me puedas despejar, la parte del if, al menos con el segundo objeto no comprendo xq toma los dos ultimos gatos, siendo que al iterar por el primer elemento followers siempre va a ser mayor que maxFollowers, es decir, siempre el primer nombre se va a grabar en el array...esa es mi duda...graias!!
@joan soto
si se guarda en al array inicialmente pero en la siguiente iteración se sobrescribe ya que encontró otro mayor
Hola, Carlos. Me gustó tu solución, pero no entiendo por qué dentro del if, vuelves a inicializar la variable 'gatosFamosos'?
Me puedes explicar, por favor?
Buenas Cristian, dentro del if reasigno la variable gatosFamosos para dejarla vacía de elementos.
Al cumplirse el if significa que ese mishi tiene más seguidores que todos los anteriores, por lo tanto, si anteriormente metí un mishi o más (en caso de que haya varios mishis con la misma cantidad de seguidores) debo sacarlos del arreglo, podría usar el metodo .pop() para ir sacando mishi por mishi, pero se me hizo que directamente limpiar el arreglo era más sencillo.
Admiro la manera en la que haces codigo, muy claro
Quise hacer todo con un reduce dentro de un map, pero no era viable sin modificar el objeto original y en eso me acordé que ya vimos el for.
Va mi código:
.
.
.
.
.
.
.
.
.
.
// Tu código aquí 👈// inicializo las variables que voy a necesitarlet mostFamousCats =[];// Lista de gatos famosos, en array para poder hacer el pushlet maxFollowers=0;// Número máximo de seguidores encontrado. No puede haber menos que cero followers... ¿o si?//recorremos el objeto catsfor(const individualCat of cats){// Sumamos los followers que tiene este gatito en todas sus redes socialeslet currCatFollowers = individualCat.followers.reduce(function(acc,num){return acc + num;},0);// Comparamos si el gatito tiene más seguidores que el gatito anterior (o más de cero seguidores, si es el primero)// y si es así, entonces borramos el arreglo y agregamos a la lista al nuevo campeón// Pero, si el gatito tiene los mismos seguidores que el anterior campeón (o si es el primero, y tiene cero seguidores), lo agregamos a la lista de campeonesif(currCatFollowers > maxFollowers){ mostFamousCats =[]; mostFamousCats.push(individualCat.name); maxFollowers=currCatFollowers;// Actualizamos el número de seguidores a vencer}elseif(currCatFollowers === maxFollowers){ mostFamousCats.push(individualCat.name);// Si hubo un empate, agregarlo a la list a}}// Listo! Retornamos la lista de campeones en un arregloreturn(mostFamousCats);
hola, leyendo tu codigo muy explicado por cierto, me queda la duda de si sirve para solo 2 inputs, que pasa si hay 3 o 5?
Este estuvo un poco menos dificil porque en las lecturas si nos daban la mayoría de herramientas para la resolución; pero si me llevó su buen par de horas xD
...
Aquí mi respuesta (con datos extra para facilitar la ejecucion si quieren probarlo fuera de platzi):
...
...
.
.
.
.
.
.
.
let cats =[{name:"Mimi",followers:[320,120,70]},{name:"Milo",followers:[400,300,100,200]},{name:"Gizmo",followers:[250,750]}]functionfindFamousCats(cats){let totalFollowers =0;let totalMayor=0;let onlyNumbers =[];let onlyWinners =[];let mapedCats = cats.map(function(cat){ totalFollowers = cat.followers.reduce(function(a, n){return a + n;}); onlyNumbers.push(totalFollowers);//Suma de los followers de cada gatoreturn[cat.name, cat.followers= totalFollowers]//retorna un nuevo array con nombre y total}); totalMayor =Math.max(...onlyNumbers);//calcula cual es el numero más grande de followerslet filterCats = mapedCats.filter(function(cat){//filtra los gatos ganadores segun el totalMayorif(cat[1]=== totalMayor){ onlyWinners.push(cat[0])return onlyWinners;}})return onlyWinners;}findFamousCats(cats)
Existen muchas formas de hacerlo, a mi se me ocurrió esta :thinking:.
exportfunctionfindFamousCats(cats){// Tu código aquí 👈let maxFollowers =0;let famousCats =[];for(let cat of cats){const followersSum = cat.followers.reduce((total, followers)=> total + followers,0);if(followersSum > maxFollowers){ maxFollowers = followersSum; famousCats =[cat.name];}elseif(followersSum === maxFollowers){ famousCats.push(cat.name);}};return famousCats;}
Buena el mio fue mas revuelto pero funciona jaja
exportfunctionfindFamousCats(cats){var array =[];var max;for(let i =0; i < cats.length; i++){var total = cats[i].followers.reduce((a, follow)=> a + follow,0); cats[i]['total']= total; array.push(total)} max =Math.max(...array)return(cats.filter(cat=> cat['total']=== max)).map(function(a){return a.name})}
no se que es peor.. no entender, o ver las explicaciones de todos y ver que no puedo seguir el desafio porque no entiendo.
¡Hola! En este caso que dudas tienes con el ejercicio?
Me costo un monton sacar la logica para recorrer un array de objetos, pero lo logre:
exportfunctionfindFamousCats(cats){const data = cats.map(cat=>({name: cat.name,totalFollowers: cat.followers.reduce((acc, count)=> acc + count,0)}));const maxFollowers =Math.max(...data.map(cat=> cat.totalFollowers));return data
.filter(cat=> cat.totalFollowers=== maxFollowers).map(cat=> cat.name);}
Con map se transforman los datos; Esto para pasar el array de followers a un totalFollowers.
Con reducese suma el array de followers para que en totalFollowers solo quede la suma de todos los followers.
Con Math.max se encuentra la mayor cantidad de followers; recorriendo nuevamente con map para extraer el dato de totalFollowers y entonces obtener el maximo.
Con filter se comparan los totalFollowers con el maxFollowers para extraer unicamente los que son equivalentes, y con map solo se extraen los nombres.
Lo intente de esta manera pero no me corre, la logica en teoria esta bien pero no se que me falta, agradezco la opinion de quien pueda ayudarme a entenderlo.(
¡Hola @NicolasSPC!
Recuerda que la función de console.log es desplegar solo en consola la información, lo que debes hacer es poner un return gatoNombre para que la función retorne algo y pueda pasar los tests.
¿Ya te encuentras en el Discord oficial de Platzi? Ahí podemos indagar más a fondo sobre este desafío
Un abrazo!
Hola! No entiendo bien desde esta parte:
for(let i =0; i < cats.length; i++){// Iteramos por cada gatito recibido en el arrayconst cat = cats[i];// Obtenemos la suma total de seguidores con reduceconst totalFollowers = cat.followers.reduce((acum, currentVal)=> acum + currentVal,0);
No entiendo de dónde sale el acum y currentval, alguien me explica bien? Espero no ser el único medio perdido.
Tampoco entiendo de dónde sale ese 0 final de la función reduce en la variable totalFollowers
¡Hola dante!
Básicamente el método reduce() es un método propio de los arrays que al momento de utilizarlo necesita que le pasemos dos nombres (que no deben ser nombres de variables utilizadas) en los cuales almacenará los siguientes valores.
El valor acumulador
El valor actual
Yo personalmente elegí los nombres de acum y currentVal para hacer más descriptivas las variables pero son nombres arbitrarios que facilmente también pueden ser valorAcumulado y valorActual.
/
De tal manera que el siguiente código
const totalFollowers = cat.followers.reduce((acum, currentVal)=> acum + currentVal,0);
Con todo esto podemos empezar a manipular el resultado según lo requiera el objetivo del ejercicio. En este caso lo que hicimos es que en cada iteración sumar el valor acumulado acum (El cual lo inicializamos en 0, es por eso que al final va ese número) al valor sobre el que se esté iterando currentVal.
¿te sirvió de ayuda? Cualquier cosa estoy al pendiente :D