const App = () => { const course = [{ id: 1, name: 'Half Stack application development', parts: [ { name: 'Fundamentals of React', exercises: 10, id: 1 }, { name: 'Using props to pass data', exercises: 7, id: 2 }, { name: 'State of a component', exercises: 14, id: 3 } ] }, { name: 'Node.js', id: 2, parts: [ { name: 'Routing', exercises: 3, id: 1 }, { name: 'Middlewares', exercises: 7, id: 2 } ] } ]Estoy tratando de calcular la suma de los ejercicios en cada uno de los cursos para poder obtener algo al final de cada curso que dice Total de ejercicios: 31 al final de Half Stack Application Development y total de ejercicios 10: al final de Node .js
Yo he tratado
const totals = course.map(c => c.parts.map(c => c.exercises.map(c => c.reduce((a, b) => a + b, 0))))pero recibido c.exercises.map no es una función.
¿Cómo podría calcular la suma de cada uno de c.ejercicios?
ejercicios se ve así en la consola:
(2) [Array(3), Array(2)] 0: (3) [10, 7, 14] 1: (2) [3, 7] length: 2Esto para calcular solo la cantidad de ejercicios por curso.
const calculateTotalExercises = course => course.map(c => c.parts.reduce((res, { exercises }) => res + exercises, 0)) const course = [{ id: 1, name: 'Half Stack application development', parts: [{ name: 'Fundamentals of React', exercises: 10, id: 1 }, { name: 'Using props to pass data', exercises: 7, id: 2 }, { name: 'State of a component', exercises: 14, id: 3 } ] }, { name: 'Node.js', id: 2, parts: [{ name: 'Routing', exercises: 3, id: 1 }, { name: 'Middlewares', exercises: 7, id: 2 } ] } ] console.log(calculateTotalExercises(course))Probablemente será más conveniente agregar el total del ejercicio a la matriz de esta manera
const calculateTotalExercises = course => course.map(c => ({...c, totalExercise : c.parts.reduce((res, p) => res + p.exercises, 0)})) const course = [{ id: 1, name: 'Half Stack application development', parts: [{ name: 'Fundamentals of React', exercises: 10, id: 1 }, { name: 'Using props to pass data', exercises: 7, id: 2 }, { name: 'State of a component', exercises: 14, id: 3 } ] }, { name: 'Node.js', id: 2, parts: [{ name: 'Routing', exercises: 3, id: 1 }, { name: 'Middlewares', exercises: 7, id: 2 } ] } ] console.log(calculateTotalExercises(course))Podrías empezar desglosando el problema. Así es como resolví esto.
Creé una función que encuentra el número total de ejercicios para un curso
let totalExerciseForOneCourse = (parts) => { return parts.reduce((prev, curr) => prev + curr.exercises, 0) }Luego, usamos el método de mapa para recorrer cada curso en la matriz de cursos , devolviendo una nueva matriz de objetos con todo lo que estaba en la matriz de cursos y agregando una propiedad de objeto totalExercises
let newCourses = courses.map((course) => { const total = totalExerciseForOneCourse(course.parts); return Object.assign({}, course, { totalExercises: total }) })Nuestra función totalExerciseForOneCourse toma un parámetro de matriz y calcula la suma de todos los ejercicios para un curso usando el método array.reduce
newCourses contiene nuestra nueva matriz con toda la información anterior y nueva
JSFiddle -
La suma de varias matrices se puede representar en un solo componente con este aspecto
{c.parts.reduce((a, b) => a += b.exercises, 0)}