Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

129
Vistas
Obtenga la suma total del monto del precio multiplicado por la cantidad sobre matrices anidadas

He anidado una matriz de objetos como este:

 [ { tasks: [ { requestTaskId: 'be6ee458-8ef0-11ec-912a-3d12c29b6342', price: 5, }, { requestTaskId: 'be6ee502-8ef0-11ec-b81a-3d12c29b6342', price: 5, }, ], request: { tasks: [ { id: 'be6ee458-8ef0-11ec-912a-3d12c29b6342', quantity: 10, }, { id: 'be6ee502-8ef0-11ec-b81a-3d12c29b6342', quantity: 10, }, ], }, }, ];

Y necesito sumar todo el precio y la cantidad de las tareas, también verificando/cotejando por tasks.requestTaskId === request.tasks.id .

El resultado debe ser (10 * 5) + (10 * 5) = 100.

¿Cómo obtener esto usando map / find / reduce ? No puedo pensar en mejores ayudantes para lograr esto, simplemente no sé cómo combinar todo.

Esto es lo que probé:

 array.map((item) => ({ ...item, ...item.request.tasks.find((requestTask) => ({ ...requestTask, ...item.tasks.find(({ requestTaskId }) => requestTaskId === requestTask.id), })), })) .map(({ amount, quantity})) => ({ total: amount * quantity, });
about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Aquí hay un ejemplo con sus datos dados, asumiendo que ocurren múltiples objetos en el objeto de nivel superior:

 const data = [{ tasks: [{ requestTaskId: 'be6ee458-8ef0-11ec-912a-3d12c29b6342', price: 5, }, { requestTaskId: 'be6ee502-8ef0-11ec-b81a-3d12c29b6342', price: 5, }, ], request: { tasks: [{ id: 'be6ee458-8ef0-11ec-912a-3d12c29b6342', quantity: 10, }, { id: 'be6ee502-8ef0-11ec-b81a-3d12c29b6342', quantity: 10, }, ], }, },]; // function for calculating the total of one object holding tasks and request props. function calculateTotalPrice(entity) { // iterate through all tasks and "reduce" them to one number :) return entity.tasks.reduce((total, task) => { // Search for a request with the same id!. const request = entity.request.tasks.find(request => request.id === task.requestTaskId) if (request) { return total + (request.quantity * task.price) } // If no price is found, return current total and log something!. console.log('No price found for task:', task) return total }, 0) } // With your object you can now reduce this aswell for getting the grand // total over all objects.. const totalPrice = data.reduce((grandTotal, entity) => { return grandTotal + calculateTotalPrice(entity) }, 0) console.log('totalPrice:', totalPrice)
about 4 years ago · Juan Pablo Isaza Denunciar

0

Puede usar Array.reduce() para sumar el precio total de todas las tareas, llamando primero a la matriz de entrada y luego a las tareas.

Si no se encuentra requestTask para una tarea, simplemente dejaremos el total como está. Puede cambiar este comportamiento para generar un error si cree que esto refleja mejor su caso de uso.

Envolveríamos esto en una función getTotalSum() .

 let input1 = [ { tasks: [ { requestTaskId: 'be6ee458-8ef0-11ec-912a-3d12c29b6342', price: 5, }, { requestTaskId: 'be6ee502-8ef0-11ec-b81a-3d12c29b6342', price: 5, }, ], request: { tasks: [ { id: 'be6ee458-8ef0-11ec-912a-3d12c29b6342', quantity: 10, }, { id: 'be6ee502-8ef0-11ec-b81a-3d12c29b6342', quantity: 10, }, ], }, }, ]; let input2 = [ { tasks: [ { requestTaskId: '4a0cc1d8-9720-48c4-9678-3372c20ff7c3', price: 10, }, { requestTaskId: '6c178a61-e9aa-45bf-bcde-1a52bcd29205', price: 1, }, ], request: { tasks: [ { id: '4a0cc1d8-9720-48c4-9678-3372c20ff7c3', quantity: 2, }, { id: '6c178a61-e9aa-45bf-bcde-1a52bcd29205', quantity: 3, }, ], }, }, ]; function getTotalSum(input) { return input.reduce((total, { tasks, request }) => { return tasks.reduce((total, task) => { const requestTask = request.tasks.find(({ id }) => id === task.requestTaskId); total += requestTask ? task.price * requestTask.quantity: 0; return total; }, total) }, 0) } console.log('Sum1:', getTotalSum(input1)) console.log('Sum2:', getTotalSum(input2))

about 4 years ago · Juan Pablo Isaza Denunciar

0

Si su objeto está ordenado como se muestra con cada tarea que marcha la solicitud correspondiente por índice, entonces usar los métodos .map() y .reduce() lograría su objetivo:

 const total = orders.map(order => order.tasks.reduce( (tot, prod, index) => tot + prod.price * order.request.tasks[index].quantity, 0 )); console.log( total );

MANIFESTACIÓN

 const orders = [{ tasks: [{ requestTaskId: 'be6ee458-8ef0-11ec-912a-3d12c29b6342', price: 5, }, { requestTaskId: 'be6ee502-8ef0-11ec-b81a-3d12c29b6342', price: 5, }, ], request: { tasks: [{ id: 'be6ee458-8ef0-11ec-912a-3d12c29b6342', quantity: 10, }, { id: 'be6ee502-8ef0-11ec-b81a-3d12c29b6342', quantity: 10, }, ], }, },{ tasks: [{ requestTaskId: 'dabee458-8ef0-11ec-912a-3d12c29b6342', price: 15, }, { requestTaskId: 'dabee502-8ef0-11ec-b81a-3d12c29b6342', price: 15, }, ], request: { tasks: [{ id: 'dabee458-8ef0-11ec-912a-3d12c29b6342', quantity: 15, }, { id: 'dabee502-8ef0-11ec-b81a-3d12c29b6342', quantity: 50, }, ], }, }]; const total = orders.map(order => order.tasks.reduce( (tot, prod, index) => tot + prod.price * order.request.tasks[index].quantity, 0 )); console.log( total );

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda