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, });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)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))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 );