Cuando trabajas con arrays en JavaScript, los métodos de orden superior find y reduce te ayudan a buscar elementos específicos y a transformar colecciones en un único valor. Aprenderás cómo usarlos con ejemplos prácticos sobre notas y números, ideal si ya manejas filter y map y quieres dar el siguiente paso.
¿Cómo funciona el método find en JavaScript?
El método find recorre un array y devuelve el primer elemento que cumple con la condición definida en la función callback. A diferencia de filter, que entrega todos los coincidentes, find se detiene en el primero.
Imagina que tienes un array llamado notas3 y quieres ubicar la nota cuyo id sea igual a 2. Lo resuelves así [00:32]:
javascript
const nota = notas3.find((nota) => nota.id === 2);
console.log(nota);
Fíjate en un detalle de estilo: aunque puedes nombrar el parámetro como n, conviene usar nota para que el código sea descriptivo y se entienda qué representa cada elemento dentro de la iteración.
¿Qué devuelve find si no encuentra nada? Devuelve undefined. En cambio, filter devuelve un array vacío [] cuando ningún elemento cumple la condición.
¿Cuándo usar find y cuándo usar filter?
La elección depende de cuántos resultados necesitas:
Usa find cuando buscas un único elemento, por ejemplo, localizar un usuario por su ID.
Usa filter cuando necesitas todos los elementos que cumplan la condición, como obtener todas las notas de una categoría.
Recuerda que filter recorre todo el array, mientras que find se detiene apenas encuentra una coincidencia.
Esta diferencia impacta el rendimiento cuando trabajas con colecciones grandes, así que vale la pena elegir el método correcto desde el inicio.
¿Qué es reduce y para qué sirve en arrays?
El método reduce ejecuta una función reductora sobre cada elemento del array y los va acumulando en un resultado final. Es perfecto para sumar, multiplicar, concatenar o transformar una lista en un valor único [02:25].
El ejemplo clásico es sumar los números del 1 al 5:
Aquí acc es el acumulador, n es el valor actual y el 0 final representa el valor inicial del acumulador. La lógica es simple: en cada iteración tomas lo que ya llevas acumulado y le sumas el nuevo valor.
¿Qué pasa si cambio el valor inicial del acumulador? Si en lugar de 0 usas 10, el resultado será 25, porque reduce arranca desde 10 y a partir de ahí suma cada elemento del array.
¿Cómo aplicar reduce a casos más complejos?
Reduce no se limita a sumar números. Puedes usarlo para contar elementos por categoría, agrupar datos o construir objetos a partir de un array. El reto consiste en aplicar reduce a un arreglo de notas y devolver un objeto que indique cuántas notas existen por cada categoría [04:14].
La idea general sería algo así:
Iniciar el acumulador como un objeto vacío {}.
En cada iteración, revisar la categoría de la nota actual.
Incrementar el contador correspondiente dentro del acumulador.
Este tipo de ejercicios te entrenan para pensar en términos de transformación de datos, una habilidad clave cuando trabajas con APIs, dashboards o cualquier lógica de negocio que dependa de agrupar información.
¿Qué diferencias clave debes recordar entre find, filter y reduce?
Los tres son métodos de orden superior, pero resuelven problemas distintos:
find devuelve un solo elemento o undefined si no hay coincidencia.
filter devuelve un array con todos los elementos que cumplen la condición, o un array vacío.
reduce devuelve un único valor acumulado, que puede ser un número, string, objeto o array.
Dominar estos tres te permite escribir código más declarativo, legible y mantenible, sin recurrir a bucles for tradicionales para tareas que ya están resueltas con métodos nativos.
¿Ya intentaste resolver el reto de contar notas por categoría con reduce? Comparte tu solución en los comentarios para que la comunidad pueda revisarla y aprender de tu enfoque.
/**
* Reto: find, filter y reduce
*
* En este reto practicarás los tres métodos de orden superior más importantes
* para trabajar con arreglos: find, filter y reduce.
*
* Conceptos clave:
* - find: retorna el PRIMER elemento que cumple la condición (o undefined)
* - filter: retorna TODOS los elementos que cumplen la condición (array vacío si no hay)
* - reduce: acumula un resultado final recorriendo todo el array
*//**
* Ejercicio 1: buscarNotaPorId
*
* Usa find para retornar la nota que tenga el id especificado.
* Si no existe, retorna undefined.
*
* @param{Array}notas - Arreglo de objetos nota con propiedades: id, title, content, category
* @param{number}id - El id a buscar
* @returns{Object|undefined} La nota encontrada o undefined
*/functionbuscarNotaPorId(notas, id){// Tu código aquíreturn notas.find((nota)=>nota.id===id);}const notas=[{id:1,title:'título1',content:'contenido1',category:'categoría1'},{id:2,title:'título2',content:'contenido2',category:'categoría2'}]console.log(buscarNotaPorId(notas,2));console.log(buscarNotaPorId(notas,3));/**
* Ejercicio 2: buscarNotaPorTituloExacto
*
* Usa find para retornar la nota cuyo título coincida exactamente (===)
* con el título buscado. La comparación debe ser sensible a mayúsculas/minúsculas.
*
* @param{Array}notas - Arreglo de notas
* @param{string}titulo - El título exacto a buscar
* @returns{Object|undefined} La nota encontrada o undefined
*/functionbuscarNotaPorTituloExacto(notas, titulo){// Tu código aquíreturn notas.find((nota)=>nota.title===titulo);}const notas2=[{id:1,title:'título1',content:'contenido1',category:'categoría1'},{id:2,title:'título2',content:'contenido2',category:'categoría2'}]console.log(buscarNotaPorTituloExacto(notas2,'título2'));/**
* Ejercicio 3: filtrarNotasPorCategoria
*
* Usa filter para retornar todas las notas que pertenezcan
* a la categoría especificada.
*
* @param{Array}notas - Arreglo de notas
* @param{string}categoria - La categoría a filtrar
* @returns{Array} Arreglo con las notas de esa categoría (vacío si no hay)
*/functionfiltrarNotasPorCategoria(notas, categoria){// Tu código aquíreturn notas.filter((nota)=>nota.category.toLowerCase().includes(categoria));}const notas3=[{id:1,title:'título1',content:'contenido1',category:'categoría1'},{id:2,title:'título2',content:'contenido2',category:'categoría2'}]console.log(filtrarNotasPorCategoria(notas3,'categoría1'));/**
* Ejercicio 4: filtrarNotasPorLongitudMinima
*
* Usa filter para retornar todas las notas cuyo content tenga
* una longitud mayor o igual a la especificada.
*
* @param{Array}notas - Arreglo de notas
* @param{number}longitudMinima - Cantidad mínima de caracteres
* @returns{Array} Notas que cumplan la condición
*/functionfiltrarNotasPorLongitudMinima(notas, longitudMinima){// Tu código aquíreturn notas.filter((nota)=>{return nota.longitud>longitudMinima;})}const notas4=[{id:1,title:'título1',content:'contenido1',category:'categoría1',longitud:10},{id:2,title:'título2',content:'contenido2',category:'categoría2',longitud:20}]console.log(filtrarNotasPorLongitudMinima(notas4,15));/**
* Ejercicio 5: sumarIds
*
* Usa reduce para sumar todos los id de las notas.
* El valor inicial del acumulador debe ser 0.
*
* @param{Array}notas - Arreglo de notas
* @returns{number} La suma de todos los ids
*/functionsumarIds(notas){// Tu código aquíreturn notas.reduce((acc,n)=>acc+n,0)}const notas5=[10,8,7,9,10];console.log(sumarIds(notas5));/**
* Ejercicio 6: concatenarTitulos
*
* Usa reduce para concatenar todos los títulos de las notas
* separados por un guión (-). El valor inicial debe ser string vacío "".
*
* Ejemplo: [{title: "A"}, {title: "B"}] → "A-B"
*
* @param{Array}notas - Arreglo de notas
* @returns{string} String con los títulos concatenados
*/functionconcatenarTitulos(notas){// Tu código aquíreturn notas.reduce((acc,n)=>acc +(acc ?'-':'')+ n.title,'');}const titulos=[{title:"A"},{title:"B"},{title:"C"}];console.log(concatenarTitulos(titulos));/**
* Ejercicio 7: contarNotasPorCategoria (Reto avanzado)
*
* Usa reduce para contar cuántas notas existen por cada categoría.
* El acumulador debe ser un objeto vacío {}.
*
* Ejemplo de resultado: { trabajo: 2, personal: 1, estudio: 3 } *
* Tip: En cada iteración, usa la categoría de la nota como clave del objeto.
* Si la clave no existe, inicialízala en 0, luego incrementa.
*
* @param{Array}notas - Arreglo de notas
* @returns{Object} Objeto con categorías como claves y conteos como valores
*/functioncontarNotasPorCategoria(notas){// Tu código aquíreturn notas.reduce((acc,nota)=>{const categoria=nota.categoria; acc[categoria]=(acc[categoria]||0)+1;//se usa acc[categoria] en vez de acc.categoria porque si escribes acc.categoria, // JavaScript buscará literalmente una propiedad llamada "categoria" dentro del // objeto acc. Como no se quiere usar la propiedad fija, sino el valor de esa variable// como el nombre de la propiedad//es como decirle: "No busques la palabra 'categoria', evalúa lo que hay dentro y usa eso como clave".//Al usar acc.categoria, estarías tratando de reescribir una y otra vez la misma propiedad, perdiendo toda la información anterior.// Con acc[categoria], estás clasificando. Estás creando nuevas propiedades en tu objeto dinámicamente según el valor que traiga cada nota.// Es la diferencia entre tener un solo archivador que siempre borras, o tener un archivero donde vas creando carpetas nuevas según las necesitas.return acc;},{});}const notas6 =[{id:1,categoria:'trabajo',texto:'Reunión'},{id:2,categoria:'estudio',texto:'JS'},{id:3,categoria:'trabajo',texto:'Email'},{id:4,categoria:'personal',texto:'Comprar pan'},{id:5,categoria:'estudio',texto:'React'},{id:6,categoria:'estudio',texto:'Node'}];console.log(contarNotasPorCategoria(notas6));/**
* Ejercicio 8: calcularPromedioDeIds
*
* Usa reduce para calcular el promedio de todos los ids.
* Primero suma todos los ids, luego divide por la cantidad de notas.
*
* @param{Array}notas - Arreglo de notas
* @returns{number} El promedio de los ids
*/functioncalcularPromedioDeIds(notas){// Tu código aquíconst suma= notas.reduce((acc,n)=> acc+n,0);return suma/notas.length;}const notas7=[10,8,7,9,10];console.log(calcularPromedioDeIds(notas7));module.exports={ buscarNotaPorId, buscarNotaPorTituloExacto, filtrarNotasPorCategoria, filtrarNotasPorLongitudMinima, sumarIds, concatenarTitulos, contarNotasPorCategoria, calcularPromedioDeIds,};
Aquí encontraran el reto:
/**
* Reto: find, filter y reduce
*
* En este reto practicarás los tres métodos de orden superior más importantes
* para trabajar con arreglos: find, filter y reduce.
*
* Conceptos clave:
* - find: retorna el PRIMER elemento que cumple la condición (o undefined)
* - filter: retorna TODOS los elementos que cumplen la condición (array vacío si no hay)
* - reduce: acumula un resultado final recorriendo todo el array
*//**
* Ejercicio 1: buscarNotaPorId
*
* Usa find para retornar la nota que tenga el id especificado.
* Si no existe, retorna undefined.
*
* @param{Array}notas - Arreglo de objetos nota con propiedades: id, title, content, category
* @param{number}id - El id a buscar
* @returns{Object|undefined} La nota encontrada o undefined
*/functionbuscarNotaPorId(notas, id){const notaId = notas.find(nota=> nota.id=== id);return notaId;}/**
* Ejercicio 2: buscarNotaPorTituloExacto
*
* Usa find para retornar la nota cuyo título coincida exactamente (===)
* con el título buscado. La comparación debe ser sensible a mayúsculas/minúsculas.
*
* @param{Array}notas - Arreglo de notas
* @param{string}titulo - El título exacto a buscar
* @returns{Object|undefined} La nota encontrada o undefined
*/functionbuscarNotaPorTituloExacto(notas, titulo){const tituloDeNota = notas.find(nota=> nota.title=== titulo);return tituloDeNota;}/**
* Ejercicio 3: filtrarNotasPorCategoria
*
* Usa filter para retornar todas las notas que pertenezcan
* a la categoría especificada.
*
* @param{Array}notas - Arreglo de notas
* @param{string}categoria - La categoría a filtrar
* @returns{Array} Arreglo con las notas de esa categoría (vacío si no hay)
*/functionfiltrarNotasPorCategoria(notas, categoria){const categoriaDeNotas = notas.filter(nota=> nota.category=== categoria);return categoriaDeNotas;}/**
* Ejercicio 4: filtrarNotasPorLongitudMinima
*
* Usa filter para retornar todas las notas cuyo content tenga
* una longitud mayor o igual a la especificada.
*
* @param{Array}notas - Arreglo de notas
* @param{number}longitudMinima - Cantidad mínima de caracteres
* @returns{Array} Notas que cumplan la condición
*/functionfiltrarNotasPorLongitudMinima(notas, longitudMinima){const notaEspecifica = notas.filter(nota=> nota.content.length>= longitudMinima);return notaEspecifica;}/**
* Ejercicio 5: sumarIds
*
* Usa reduce para sumar todos los id de las notas.
* El valor inicial del acumulador debe ser 0.
*
* @param{Array}notas - Arreglo de notas
* @returns{number} La suma de todos los ids
*/functionsumarIds(notas){const suma = notas.reduce((acc, n)=> acc + n.id,0);return suma;}/**
* Ejercicio 6: concatenarTitulos
*
* Usa reduce para concatenar todos los títulos de las notas
* separados por un guión (-). El valor inicial debe ser string vacío "".
*
* Ejemplo: [{title: "A"}, {title: "B"}] → "A-B"
*
* @param{Array}notas - Arreglo de notas
* @returns{string} String con los títulos concatenados
*/functionconcatenarTitulos(notas){const sumaDeTitulos = notas.reduce((acc, n)=>{return acc ===''? n.title: acc +'-'+ n.title,''});};/**
* Ejercicio 7: contarNotasPorCategoria (Reto avanzado)
*
* Usa reduce para contar cuántas notas existen por cada categoría.
* El acumulador debe ser un objeto vacío {}.
*
* Ejemplo de resultado: { trabajo: 2, personal: 1, estudio: 3 } *
* Tip: En cada iteración, usa la categoría de la nota como clave del objeto.
* Si la clave no existe, inicialízala en 0, luego incrementa.
*
* @param{Array}notas - Arreglo de notas
* @returns{Object} Objeto con categorías como claves y conteos como valores
*/functioncontarNotasPorCategoria(notas){const notasPorCategoria = notas.reduce((acc, n)=>{const categoria = n.category;if(!acc[categoria]){ acc[categoria]=0} acc[categoria]++;return acc;},{});return notasPorCategoria;}/**
* Ejercicio 8: calcularPromedioDeIds
*
* Usa reduce para calcular el promedio de todos los ids.
* Primero suma todos los ids, luego divide por la cantidad de notas.
*
* @param{Array}notas - Arreglo de notas
* @returns{number} El promedio de los ids
*/functioncalcularPromedioDeIds(notas){const sumaIds = notas.reduce((acc, n)=> acc + n.id,0);const promedioIds = sumaIds / notas.length;return promedioIds;}module.exports={ buscarNotaPorId, buscarNotaPorTituloExacto, filtrarNotasPorCategoria, filtrarNotasPorLongitudMinima, sumarIds, concatenarTitulos, contarNotasPorCategoria, calcularPromedioDeIds,};
Mi solución al reto:
/**
* Reto: find, filter y reduce
*
* En este reto practicarás los tres métodos de orden superior más importantes
* para trabajar con arreglos: find, filter y reduce.
*
* Conceptos clave:
* - find: retorna el PRIMER elemento que cumple la condición (o undefined)
* - filter: retorna TODOS los elementos que cumplen la condición (array vacío si no hay)
* - reduce: acumula un resultado final recorriendo todo el array
*//**
* Ejercicio 1: buscarNotaPorId
*
* Usa find para retornar la nota que tenga el id especificado.
* Si no existe, retorna undefined.
*
* @param{Array}notas - Arreglo de objetos nota con propiedades: id, title, content, category
* @param{number}id - El id a buscar
* @returns{Object|undefined} La nota encontrada o undefined
*/functionbuscarNotaPorId(notas, id){// Tu código aquíconst encontrada = notas.find((nota)=> nota.id=== id);return encontrada;}const notas =[{id:1,title:'Nota 1',content:'Contenido de la nota 1',esFavorita:true},{id:2,title:'Nota 2',content:'Contenido de la nota 2',esFavorita:false},{id:3,title:'Nota 3',content:'Contenido de la nota 3',esFavorita:true}];console.log(buscarNotaPorId(notas,3));/**
* Ejercicio 2: buscarNotaPorTituloExacto
*
* Usa find para retornar la nota cuyo título coincida exactamente (===)
* con el título buscado. La comparación debe ser sensible a mayúsculas/minúsculas.
*
* @param{Array}notas - Arreglo de notas
* @param{string}titulo - El título exacto a buscar
* @returns{Object|undefined} La nota encontrada o undefined
*/functionbuscarNotaPorTituloExacto(notas, titulo){// Tu código aquíconst notatitulo = notas.find((nota)=> nota.title.toLowerCase()=== titulo);return notatitulo;}const notas1 =[{id:1,title:'Nota 1',content:'Contenido de la nota 1',esFavorita:true},{id:2,title:'Nota 2',content:'Contenido de la nota 2',esFavorita:false},{id:3,title:'Nota 3',content:'Contenido de la nota 3',esFavorita:true},{id:4,title:'Barney es un Dinosaurio',content:'Contenido de la nota 3',esFavorita:true},{id:5,title:'EL ORIGEN DE LA FECILIDAD',content:'Contenido de la nota 3',esFavorita:true},{id:6,title:'EL CAMINO del artista',content:'Contenido de la nota 3',esFavorita:true},{id:7,title:'Sueños de esta semana',content:'Contenido de la nota 3',esFavorita:true}];console.log(buscarNotaPorTituloExacto(notas1,"el origen de la fecilidad"));/**
* Ejercicio 3: filtrarNotasPorCategoria
*
* Usa filter para retornar todas las notas que pertenezcan
* a la categoría especificada.
*
* @param{Array}notas - Arreglo de notas
* @param{string}categoria - La categoría a filtrar
* @returns{Array} Arreglo con las notas de esa categoría (vacío si no hay)
*/functionfiltrarNotasPorCategoria(notas, categoria){// Tu código aquíconst categoriaNota = notas.filter((nota)=> nota.category.toLowerCase()=== categoria.toLowerCase())return categoriaNota;}const notas2 =[{id:1,title:'Nota 1',content:'Contenido de la nota 1',esFavorita:true,category:'Amor'},{id:2,title:'Nota 2',content:'Contenido de la nota 2',esFavorita:false,category:'Dinero'},{id:3,title:'Nota 3',content:'Contenido de la nota 3',esFavorita:true,category:'Amor'},{id:4,title:'Barney es un Dinosaurio',content:'Contenido de la nota 3',esFavorita:true,category:'Salud'},{id:5,title:'EL ORIGEN DE LA FECILIDAD',content:'Contenido de la nota 3',esFavorita:true,category:'salud'},{id:6,title:'EL CAMINO del artista',content:'Contenido de la nota 3',esFavorita:true,category:'dinero'},{id:7,title:'Sueños de esta semana',content:'Contenido de la nota 3',esFavorita:true,category:'AMOR'}];console.log(filtrarNotasPorCategoria(notas2,"Dinero"));/**
* Ejercicio 4: filtrarNotasPorLongitudMinima
*
* Usa filter para retornar todas las notas cuyo content tenga
* una longitud mayor o igual a la especificada.
*
* @param{Array}notas - Arreglo de notas
* @param{number}longitudMinima - Cantidad mínima de caracteres
* @returns{Array} Notas que cumplan la condición
*/functionfiltrarNotasPorLongitudMinima(notas, longitudMinima){// Tu código aquíconst longesp = notas.filter((nota)=> nota.content.length>= longitudMinima);return longesp;}const notas3 =[{id:1,title:'Nota 1',content:'Contenido de la nota 1',esFavorita:true,category:'Amor'},{id:2,title:'Nota 2',content:'Blabla',esFavorita:false,category:'Dinero'},{id:3,title:'Nota 3',content:'Fernandez',esFavorita:true,category:'Amor'},{id:4,title:'Barney es un Dinosaurio',content:'Fer',esFavorita:true,category:'Salud'},{id:5,title:'EL ORIGEN DE LA FECILIDAD',content:'05/10',esFavorita:true,category:'salud'},{id:6,title:'EL CAMINO del artista',content:'Contenido de la nota 6',esFavorita:true,category:'dinero'},{id:7,title:'Sueños de esta semana',content:'Contenido de la nota 7',esFavorita:true,category:'AMOR'}];console.log(filtrarNotasPorLongitudMinima(notas3,10));/**
* Ejercicio 5: sumarIds
*
* Usa reduce para sumar todos los id de las notas.
* El valor inicial del acumulador debe ser 0.
*
* @param{Array}notas - Arreglo de notas
* @returns{number} La suma de todos los ids
*/functionsumarIds(notas){// Tu código aquíconst idsumas = notas.reduce((acumulador, nota)=> acumulador + nota.id,0);return idsumas;}const notas4 =[{id:1,title:'Nota 1',content:'Contenido de la nota 1',esFavorita:true,category:'Amor'},{id:2,title:'Nota 2',content:'Blabla',esFavorita:false,category:'Dinero'},{id:3,title:'Nota 3',content:'Fernandez',esFavorita:true,category:'Amor'},{id:4,title:'Barney es un Dinosaurio',content:'Fer',esFavorita:true,category:'Salud'},{id:5,title:'EL ORIGEN DE LA FECILIDAD',content:'05/10',esFavorita:true,category:'salud'},{id:6,title:'EL CAMINO del artista',content:'Contenido de la nota 6',esFavorita:true,category:'dinero'},{id:7,title:'Sueños de esta semana',content:'Contenido de la nota 7',esFavorita:true,category:'AMOR'}];console.log(sumarIds(notas4));/**
* Ejercicio 6: concatenarTitulos
*
* Usa reduce para concatenar todos los títulos de las notas
* separados por un guión (-). El valor inicial debe ser string vacío "".
*
* Ejemplo: [{title: "A"}, {title: "B"}] → "A-B"
*
* @param{Array}notas - Arreglo de notas
* @returns{string} String con los títulos concatenados
*/functionconcatenarTitulos(notas){// Tu código aquíconst titulos = notas.reduce((acumulador, nota)=> acumulador +"-"+ nota.title,"");return titulos;}const notas5 =[{id:1,title:'Nota 1',content:'Contenido de la nota 1',esFavorita:true,category:'Amor'},{id:2,title:'Nota 2',content:'Blabla',esFavorita:false,category:'Dinero'},{id:3,title:'Nota 3',content:'Fernandez',esFavorita:true,category:'Amor'},{id:4,title:'Barney es un Dinosaurio',content:'Fer',esFavorita:true,category:'Salud'},{id:5,title:'EL ORIGEN DE LA FECILIDAD',content:'05/10',esFavorita:true,category:'salud'},{id:6,title:'EL CAMINO del artista',content:'Contenido de la nota 6',esFavorita:true,category:'dinero'},{id:7,title:'Sueños de esta semana',content:'Contenido de la nota 7',esFavorita:true,category:'AMOR'}];console.log(concatenarTitulos(notas5));/**
* Ejercicio 7: contarNotasPorCategoria (Reto avanzado)
*
* Usa reduce para contar cuántas notas existen por cada categoría.
* El acumulador debe ser un objeto vacío {}.
*
* Ejemplo de resultado: { trabajo: 2, personal: 1, estudio: 3 } *
* Tip: En cada iteración, usa la categoría de la nota como clave del objeto.
* Si la clave no existe, inicialízala en 0, luego incrementa.
*
* @param{Array}notas - Arreglo de notas
* @returns{Object} Objeto con categorías como claves y conteos como valores
*/functioncontarNotasPorCategoria(notas){// Tu código aquíconst resultado = notas.reduce((acumulador, nota)=>{const categoria = nota.category.toLowerCase();if(acumulador[categoria]){ acumulador[categoria]++;}else{ acumulador[categoria]=1;}return acumulador;},{});return resultado;}const notas6 =[{id:1,title:'Nota 1',content:'Contenido de la nota 1',esFavorita:true,category:'Amor'},{id:2,title:'Nota 2',content:'Blabla',esFavorita:false,category:'Dinero'},{id:3,title:'Nota 3',content:'Fernandez',esFavorita:true,category:'Amor'},{id:4,title:'Barney es un Dinosaurio',content:'Fer',esFavorita:true,category:'Salud'},{id:5,title:'EL ORIGEN DE LA FECILIDAD',content:'05/10',esFavorita:true,category:'salud'},{id:6,title:'EL CAMINO del artista',content:'Contenido de la nota 6',esFavorita:true,category:'dinero'},{id:7,title:'Sueños de esta semana',content:'Contenido de la nota 7',esFavorita:true,category:'AMOR'}];console.log(contarNotasPorCategoria(notas6));/**
* Ejercicio 8: calcularPromedioDeIds
*
* Usa reduce para calcular el promedio de todos los ids.
* Primero suma todos los ids, luego divide por la cantidad de notas.
*
* @param{Array}notas - Arreglo de notas
* @returns{number} El promedio de los ids
*/functioncalcularPromedioDeIds(notas){// Tu código aquíconst promedio = notas.reduce((acumulador, nota)=> acumulador +((nota.id)/notas.length),0);return promedio;}const notas7 =[{id:1,title:'Nota 1',content:'Contenido de la nota 1',esFavorita:true,category:'Amor'},{id:2,title:'Nota 2',content:'Blabla',esFavorita:false,category:'Dinero'},{id:3,title:'Nota 3',content:'Fernandez',esFavorita:true,category:'Amor'},{id:4,title:'Barney es un Dinosaurio',content:'Fer',esFavorita:true,category:'Salud'},{id:5,title:'EL ORIGEN DE LA FECILIDAD',content:'05/10',esFavorita:true,category:'salud'},{id:6,title:'EL CAMINO del artista',content:'Contenido de la nota 6',esFavorita:true,category:'dinero'},{id:7,title:'Sueños de esta semana',content:'Contenido de la nota 7',esFavorita:true,category:'AMOR'}];console.log(calcularPromedioDeIds(notas7));module.exports={ buscarNotaPorId, buscarNotaPorTituloExacto, filtrarNotasPorCategoria, filtrarNotasPorLongitudMinima, sumarIds, concatenarTitulos, contarNotasPorCategoria, calcularPromedioDeIds,};
/**
* Reto: find, filter y reduce
*
* En este reto practicarás los tres métodos de orden superior más importantes
* para trabajar con arreglos: find, filter y reduce.
*
* Conceptos clave:
* - find: retorna el PRIMER elemento que cumple la condición (o undefined)
* - filter: retorna TODOS los elementos que cumplen la condición (array vacío si no hay)
* - reduce: acumula un resultado final recorriendo todo el array
*//**
* Ejercicio 1: buscarNotaPorId
*
* Usa find para retornar la nota que tenga el id especificado.
* Si no existe, retorna undefined.
*
* @param{Array}notas - Arreglo de objetos nota con propiedades: id, title, content, category
* @param{number}id - El id a buscar
* @returns{Object|undefined} La nota encontrada o undefined
*/functionbuscarNotaPorId(notas, id){return notas.find((nota)=> nota.id=== id);}/**
* Ejercicio 2: buscarNotaPorTituloExacto
*
* Usa find para retornar la nota cuyo título coincida exactamente (===)
* con el título buscado. La comparación debe ser sensible a mayúsculas/minúsculas.
*
* @param{Array}notas - Arreglo de notas
* @param{string}titulo - El título exacto a buscar
* @returns{Object|undefined} La nota encontrada o undefined
*/functionbuscarNotaPorTituloExacto(notas, titulo){return notas.find((nota)=> nota.title=== titulo);}/**
* Ejercicio 3: filtrarNotasPorCategoria
*
* Usa filter para retornar todas las notas que pertenezcan
* a la categoría especificada.
*
* @param{Array}notas - Arreglo de notas
* @param{string}categoria - La categoría a filtrar
* @returns{Array} Arreglo con las notas de esa categoría (vacío si no hay)
*/functionfiltrarNotasPorCategoria(notas, categoria){return notas.filter((nota)=> nota.category=== categoria);}/**
* Ejercicio 4: filtrarNotasPorLongitudMinima
*
* Usa filter para retornar todas las notas cuyo content tenga
* una longitud mayor o igual a la especificada.
*
* @param{Array}notas - Arreglo de notas
* @param{number}longitudMinima - Cantidad mínima de caracteres
* @returns{Array} Notas que cumplan la condición
*/functionfiltrarNotasPorLongitudMinima(notas, longitudMinima){return notas.filter((nota)=> nota.content.length>= longitudMinima);}/**
* Ejercicio 5: sumarIds
*
* Usa reduce para sumar todos los id de las notas.
* El valor inicial del acumulador debe ser 0.
*
* @param{Array}notas - Arreglo de notas
* @returns{number} La suma de todos los ids
*/functionsumarIds(notas){return notas.reduce((acumulador, valor_id_actual)=> acumulador + valor_id_actual.id,0,);}/**
* Ejercicio 6: concatenarTitulos
*
* Usa reduce para concatenar todos los títulos de las notas
* separados por un guión (-). El valor inicial debe ser string vacío "".
*
* Ejemplo: [{title: "A"}, {title: "B"}] → "A-B"
*
* @param{Array}notas - Arreglo de notas
* @returns{string} String con los títulos concatenados
*/functionconcatenarTitulos(notas){return notas.reduce((acumulador, nota)=>{if(acumulador.length>0){return acumulador +"-"+ nota.title;}else{return nota.title;}},"");}/**
* Ejercicio 7: contarNotasPorCategoria (Reto avanzado)
*
* Usa reduce para contar cuántas notas existen por cada categoría.
* El acumulador debe ser un objeto vacío {}.
*
* Ejemplo de resultado: { trabajo: 2, personal: 1, estudio: 3 } *
* Tip: En cada iteración, usa la categoría de la nota como clave del objeto.
* Si la clave no existe, inicialízala en 0, luego incrementa.
*
* @param{Array}notas - Arreglo de notas
* @returns{Object} Objeto con categorías como claves y conteos como valores
*/functioncontarNotasPorCategoria(notas){return notas.reduce((acumulador, nota)=>{if(acumulador[nota.category]){ acumulador[nota.category]+=1;}else{ acumulador[nota.category]=1;}return acumulador;},{});}/**
* Ejercicio 8: calcularPromedioDeIds
*
* Usa reduce para calcular el promedio de todos los ids.
* Primero suma todos los ids, luego divide por la cantidad de notas.
*
* @param{Array}notas - Arreglo de notas
* @returns{number} El promedio de los ids
*/functioncalcularPromedioDeIds(notas){const sumaIds = notas.reduce((acumulador, nota)=> acumulador + nota.id,0);return sumaIds !==0? sumaIds / notas.length:0;}export{ buscarNotaPorId, buscarNotaPorTituloExacto, filtrarNotasPorCategoria, filtrarNotasPorLongitudMinima, sumarIds, concatenarTitulos, contarNotasPorCategoria, calcularPromedioDeIds,};
Mi solución:
// Conceptos clave// find: Retorna el primer elemento que cumple la condición. Si no hay coincidencias, retorna undefined.// filter: Retorna un nuevo array con todos los elementos que cumplen la condición. Si no hay coincidencias, retorna un array vacío [].// reduce: Ejecuta una función reductora sobre cada elemento, acumulando un solo valor de retorno. Recibe un acumulador y el valor actual./**
* Reto: find, filter y reduce
*
* En este reto practicarás los tres métodos de orden superior más importantes
* para trabajar con arreglos: find, filter y reduce.
*
* Conceptos clave:
* - find: retorna el PRIMER elemento que cumple la condición (o undefined)
* - filter: retorna TODOS los elementos que cumplen la condición (array vacío si no hay)
* - reduce: acumula un resultado final recorriendo todo el array
*//**
* Ejercicio 1: buscarNotaPorId
*
* Usa find para retornar la nota que tenga el id especificado.
* Si no existe, retorna undefined.
*
* @param{Array}notas - Arreglo de objetos nota con propiedades: id, title, content, category
* @param{number}id - El id a buscar
* @returns{Object|undefined} La nota encontrada o undefined
*/functionbuscarNotaPorId(notas, id){// Tu código aquíreturn notas.find((nota)=> nota.id=== id);}/**
* Ejercicio 2: buscarNotaPorTituloExacto
*
* Usa find para retornar la nota cuyo título coincida exactamente (===)
* con el título buscado. La comparación debe ser sensible a mayúsculas/minúsculas.
*
* @param{Array}notas - Arreglo de notas
* @param{string}titulo - El título exacto a buscar
* @returns{Object|undefined} La nota encontrada o undefined
*/functionbuscarNotaPorTituloExacto(notas, titulo){// Tu código aquíreturn notas.find((nota)=> nota.title=== titulo);}/**
* Ejercicio 3: filtrarNotasPorCategoria
*
* Usa filter para retornar todas las notas que pertenezcan
* a la categoría especificada.
*
* @param{Array}notas - Arreglo de notas
* @param{string}categoria - La categoría a filtrar
* @returns{Array} Arreglo con las notas de esa categoría (vacío si no hay)
*/functionfiltrarNotasPorCategoria(notas, categoria){// Tu código aquíreturn notas.filter((nota)=> nota.category=== categoria)}/**
* Ejercicio 4: filtrarNotasPorLongitudMinima
*
* Usa filter para retornar todas las notas cuyo content tenga
* una longitud mayor o igual a la especificada.
*
* @param{Array}notas - Arreglo de notas
* @param{number}longitudMinima - Cantidad mínima de caracteres
* @returns{Array} Notas que cumplan la condición
*/functionfiltrarNotasPorLongitudMinima(notas, longitudMinima){// Tu código aquíreturn notas.filter((nota)=> nota.content.length>= longitudMinima);}/**
* Ejercicio 5: sumarIds
*
* Usa reduce para sumar todos los id de las notas.
* El valor inicial del acumulador debe ser 0.
*
* @param{Array}notas - Arreglo de notas
* @returns{number} La suma de todos los ids
*/functionsumarIds(notas){// Tu código aquíreturn notas.reduce((acc, nota)=> acc + nota.id,0);}/**
* Ejercicio 6: concatenarTitulos
*
* Usa reduce para concatenar todos los títulos de las notas
* separados por un guión (-). El valor inicial debe ser string vacío "".
*
* Ejemplo: [{title: "A"}, {title: "B"}] → "A-B"
*
* @param{Array}notas - Arreglo de notas
* @returns{string} String con los títulos concatenados
*/functionconcatenarTitulos(notas){// Tu código aquíreturn notas.reduce((acc, nota, indice)=> acc +(indice ===0?'':'-')+ nota.title,'')}console.log(concatenarTitulos([{title:"A"},{title:"B"}]))/**
* Ejercicio 7: contarNotasPorCategoria (Reto avanzado)
*
* Usa reduce para contar cuántas notas existen por cada categoría.
* El acumulador debe ser un objeto vacío {}.
*
* Ejemplo de resultado: { trabajo: 2, personal: 1, estudio: 3 } *
* Tip: En cada iteración, usa la categoría de la nota como clave del objeto.
* Si la clave no existe, inicialízala en 0, luego incrementa.
*
* @param{Array}notas - Arreglo de notas
* @returns{Object} Objeto con categorías como claves y conteos como valores
*/functioncontarNotasPorCategoria(notas){// Tu código aquíreturn notas.reduce((acc, nota)=>{if(!acc[nota.category]){ acc[nota.category]=0} acc[nota.category]+=1;return acc;},{})}const notas =[{id:1,title:'Comprar leche',content:'Ir al supermercado',category:'personal'},{id:2,title:'Reunión con equipo',content:'Discutir el proyecto de la próxima semana y asignar tareas',category:'trabajo',},{id:3,title:'Estudiar JavaScript',content:'Repasar map, filter y reduce',category:'estudio',},{id:4,title:'Llamar al banco',content:'Consultar saldo',category:'personal'},{id:5,title:'Code review',content:'Revisar PRs pendientes del equipo de backend',category:'trabajo',},];console.log(contarNotasPorCategoria(notas));/**
* Ejercicio 8: calcularPromedioDeIds
*
* Usa reduce para calcular el promedio de todos los ids.
* Primero suma todos los ids, luego divide por la cantidad de notas.
*
* @param{Array}notas - Arreglo de notas
* @returns{number} El promedio de los ids
*/functioncalcularPromedioDeIds(notas){// Tu código aquíreturn notas.reduce((acc, nota)=> acc + nota.id/ notas.length,0)}module.exports={ buscarNotaPorId, buscarNotaPorTituloExacto, filtrarNotasPorCategoria, filtrarNotasPorLongitudMinima, sumarIds, concatenarTitulos, contarNotasPorCategoria, calcularPromedioDeIds,};