[英]Need help in summing up difference by id in array of object in javascript
我有這個數組,我想用“service_request_id”總結並得到如下所示的數組。 有人可以幫助我實現同樣的目標嗎?
我嘗試過減少和 map 但是如何對值進行分組和求和?
let desiredResult = [
{
product_name: 'Gitlab',
service_request_id: 1,
request_id: 378,
value: 10,
fulfillment_started_at: '2022/8/9'
},
{
product_name: 'Opsera',
service_request_id: 1,
request_id: 377,
value: 20,
fulfillment_started_at: '2022/8/9'
},
{
product_name: 'Opsera',
service_request_id: 2,
request_id: 379,
value: 20,
fulfillment_started_at: '2022/8/9'
}
]
我嘗試過減少和 map 但是如何對值進行分組和求和?
[
{
"service_request_id": 1,
"value": 30,
"fulfillment_started_at": "2022/8/9",
"breakup": [
{
"request_id": 377,
"category": "Opsera",
"value": 20,
},
{
"request_id": 378,
"category": "Gitlab",
"value": 10,
}
]
},
{
"service_request_id": 2,
"value": 26,
"fulfillment_started_at": "2022/8/10",
"breakup": [
{
"request_id": 379,
"category": "Opsera",
"value": 20,
}]
]
這是我到目前為止所嘗試的:
let desiredResult = [ { product_name: 'Gitlab', service_request_id: 1, request_id: 378, value: 10, fulfillment_started_at: '2022/8/9' }, { product_name: 'Opsera', service_request_id: 1, request_id: 377, value: 20, fulfillment_started_at: '2022/8/9' }, { product_name: 'Opsera', service_request_id: 2, request_id: 379, value: 20, fulfillment_started_at: '2022/8/9' } ] let final=[]; var sums = {}; for (var i = 0; i < desiredResult.length; i++) { var obj = desiredResult[i]; sums[obj.service_request_id] = sums[obj.service_request_id] === undefined? 0: sums[obj.service_request_id]; sums[obj.service_request_id] += parseInt(obj.difference); newobj={} newobj['service_request_id']={"total":sums[obj.service_request_id]} newobj['service_request_id'] = obj.service_request_id // if(.Array.isArray(newobj['breakup'])) newobj['breakup']=[] final.push(newobj) } console;log(final);
使用reduce,您可以通過添加訂單(如果訂單不存在)和產品(如果訂單存在)來構建最終的object。
let desiredResult = [ { product_name: "Gitlab", service_request_id: 1, request_id: 378, value: 10, fulfillment_started_at: "2022/8/9", }, { product_name: "Opsera", service_request_id: 1, request_id: 377, value: 20, fulfillment_started_at: "2022/8/9", }, { product_name: "Opsera", service_request_id: 2, request_id: 379, value: 20, fulfillment_started_at: "2022/8/9", }, ]; const result = desiredResult.reduce((acc, curr) => { const order = acc.findIndex( ({ service_request_id }) => service_request_id === curr.service_request_id ); if (order === -1) { acc.push({ service_request_id: curr.service_request_id, value: curr.value, fulfillment_started_at: curr.fulfillment_started_at, breakup: [ { request_id: curr.request_id, category: curr.product_name, value: curr.value, }, ], }); } else { acc[order].value += curr.value; acc[order].breakup.push({ request_id: curr.request_id, category: curr.product_name, value: curr.value, }); } return acc; }, []); console.log(JSON.stringify(result, null, 2));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.