I am trying to study Array.reduce
. And I was given the following task:
Input data:
const report = [ { dateOfReport: "11-01-2021", userId: "id1", userMetric: { first_metric: 10, second_metric: 15 }, }, { dateOfReport: "11-01-2021", userId: "id2", userMetric: { first_metric: 9, second_metric: 14 }, }, { dateOfReport: "12-01-2021", userId: "id1", userMetric: { first_metric: 11, second_metric: 14 }, }, { dateOfReport: "12-01-2021", userId: "id2", userMetric: { first_metric: 16, second_metric: 19 }, }, ];
And I need to get this data in the output
const output = [ { dateOfReport: "11-01-2021", id1: { first_metric: 10, second_metric: 15 }, id2: { first_metric: 9, second_metric: 14 }, }, { dateOfReport: "12-01-2021", id1: { first_metric: 11, second_metric: 14 }, id2: { first_metric: 16, second_metric: 19 }, }, ];
I tried to write some code, but I have no idea how to do it correctly. How can I solve this problem?
Code:
const result = report.reduce((acc, dataItem) => { let outputArray = []; if (dataItem) { outputArray.push({ ...dataItem, date: dataItem.dateOfReport, [dataItem.userId]: dataItem.userMetric }); } return outputArray; }); return result;
Advertisement
Answer
Corrected the logic
const report = [ { dateOfReport: "11-01-2021", userId: "id1", userMetric: { first_metric: 10, second_metric: 15 }, }, { dateOfReport: "11-01-2021", userId: "id2", userMetric: { first_metric: 9, second_metric: 14 }, }, { dateOfReport: "12-01-2021", userId: "id1", userMetric: { first_metric: 11, second_metric: 14 }, }, { dateOfReport: "12-01-2021", userId: "id2", userMetric: { first_metric: 16, second_metric: 19 }, }, ]; const result = report.reduce((acc, dataItem) => { const node = acc.find(item => item.dateOfReport === dataItem.dateOfReport); if (node) { node[dataItem.userId] = dataItem.userMetric; } else { acc.push({ dateOfReport: dataItem.dateOfReport, [dataItem.userId]: dataItem.userMetric }); } return acc; }, []); console.log(result);