[英]Get total sum of price amount multiplied by quantity over nested arrays
我有這樣的嵌套對象數組:
[
{
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 === request.tasks.id
條件檢查/匹配。
結果應為 (10 * 5) + (10 * 5) = 100。
如何使用map
/ find
/ reduce
得到這個? 想不出更好的幫手來實現這一點,只是不知道如何結合一切。
這是我試過的:
array.map((item) => ({
...item,
...item.request.tasks.find((requestTask) => ({
...requestTask,
...item.tasks.find(({ requestTaskId }) => requestTaskId === requestTask.id),
})),
}))
.map(({ amount, quantity})) => ({
total: amount * quantity,
});
這是您給定數據的示例,假設多個對象出現在頂層 object 中:
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)
您可以使用Array.reduce()
對所有任務的總價格求和,首先調用輸入數組,然后調用任務。
如果沒有找到任務的requestTask
,我們將簡單地保留總數不變。 如果您覺得這能更好地反映您的用例,您可以更改此行為以拋出錯誤。
我們將其包裝在getTotalSum()
function 中。
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))
如果您的 object 的順序如圖所示,每個任務按索引行進相應的請求,那么使用.map()
和.reduce()
方法將實現您的目標:
const total = orders.map(order => order.tasks.reduce(
(tot, prod, index) => tot + prod.price * order.request.tasks[index].quantity, 0
));
console.log( total );
演示
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 );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.