Examples:
Input:
[ { Phase: 'Phase 1', Step: 'Step 1', Task: 'Task 1', Value: '5' }, { Phase: 'Phase 2', Step: 'Step 2', Task: 'Task 1', Value: '35' }, { Phase: 'Phase 1', Step: 'Step 2', Task: 'Task 1', Value: '15' }, { Phase: 'Phase 1', Step: 'Step 2', Task: 'Task 2', Value: '20' }, { Phase: 'Phase 2', Step: 'Step 1', Task: 'Task 1', Value: '25' }, { Phase: 'Phase 2', Step: 'Step 2', Task: 'Task 2', Value: '40' }, { Phase: 'Phase 2', Step: 'Step 1', Task: 'Task 2', Value: '30' }, { Phase: 'Phase 1', Step: 'Step 1', Task: 'Task 2', Value: '10' } ]
Output:
[ { Phase: "Phase 1", Value: 50 }, { Phase: "Phase 2", Value: 130 } ]
const groupBy = (data, key) => { return data.reduce((storage, item) => { // get the first instance of the key by which we're grouping const group = item[key]; // set `storage` for this instance of group to the outer scope (if not empty) or initialize it storage[group] = storage[group] || []; // add this item to its group within `storage storage[group].push(item); // return the updated storage to the reduce function, which will then loop through the next return storage; }, {}); // {} is the initial value of the storage };
const res = groupBy(dataArr, 'Phase'); console.log(res);
{ 'Phase 1': [ { Phase: 'Phase 1', Step: 'Step 1', Task: 'Task 1', Value: '5' }, { Phase: 'Phase 1', Step: 'Step 2', Task: 'Task 1', Value: '15' }, { Phase: 'Phase 1', Step: 'Step 2', Task: 'Task 2', Value: '20' }, { Phase: 'Phase 1', Step: 'Step 1', Task: 'Task 2', Value: '10' } ], 'Phase 2': [ { Phase: 'Phase 2', Step: 'Step 2', Task: 'Task 1', Value: '35' }, { Phase: 'Phase 2', Step: 'Step 1', Task: 'Task 1', Value: '25' }, { Phase: 'Phase 2', Step: 'Step 2', Task: 'Task 2', Value: '40' }, { Phase: 'Phase 2', Step: 'Step 1', Task: 'Task 2', Value: '30' } ] }
const getSumPerGroup = (data, key) => { const result = []; Object.keys(data).forEach((currObjKey) => { result.push({ 'Phase': currObjKey, 'Value': data[currObjKey].reduce((acc, item) => { return acc + parseInt(item[key]); }, 0) }); }); return result; };
const res1 = getSumPerGroup(res, 'Value'); console.log(res1);
[ { Phase: 'Phase 1', Value: 50 }, { Phase: 'Phase 2', Value: 130 } ]