Reputation: 747
Trying creating array of objects based on another array of objects. Decided to use flatmap and then reduce, but the problem is when I have more than one object in result array - I can not collected several statuses in one object. Have added what i tried and what is result I am trying to achieve.
What I have
const data = [
{
"timestamp": "2021-08-31T15:29:18Z",
"result": [
{
"label": "Not Covered",
"value": 132
}
]
},
{
"timestamp": "2021-09-30T15:29:18Z",
"result": [
{
"label": "Not Covered",
"value": 135
}
]
},
{
"timestamp": "2021-10-31T16:29:18Z",
"result": [
{
"label": "Not Covered",
"value": 135
}
]
}
]
What I need to get
[
{
"Not Covered":132,
"Active":0,
"Expiring Soon":0,
"timestamp": "2021-08-31T15:29:18Z"
},
{
"Not Covered":135,
"Active":0,
"Expiring Soon":0,
"timestamp": "2021-09-30T15:29:18Z"
},
{
"Not Covered":135,
"Active":0,
"Expiring Soon":0,
"timestamp": "2021-10-31T16:29:18Z"
}
]
What I am doing
let flattenedResult = data.flatMap(({result,...r}) => result.map(o => ({ ...o,...r})));
const chartData = flattenedResult.reduce((acc, item) => {
const {timestamp, value,label} = item;
acc.push({timestamp, "Not Covered":"Not Covered"===label?value:0,"Active":"Active"===label?value:0,"Expiring Soon":"Expiring Soon"===label?value:0});
return acc;
}, []);
What i am getting:
[
{
"timestamp": "2021-08-31T15:29:18Z",
"Not Covered": 132,
"Active": 0,
"Expiring Soon": 0
},
{
"timestamp": "2021-09-30T15:29:18Z",
"Not Covered": 135,
"Active": 0,
"Expiring Soon": 0
},
{
"timestamp": "2021-10-31T16:29:18Z",
"Not Covered": 135,
"Active": 0,
"Expiring Soon": 0
}
]
Upvotes: 2
Views: 106
Reputation: 1302
You haven't explained how to get the values "Active" and "Expiring soon", but I'm sure something like that should help
const data = [
{
"timestamp": "2021-08-31T15:29:18Z",
"result": [
{
"label": "Expiring Soon",
"value": 57
},
{
"label": "Not Covered",
"value": 132
},
{
"label": "Active",
"value": 42
}
]
},
{
"timestamp": "2021-09-30T15:29:18Z",
"result": [
{
"label": "Not Covered",
"value": 135
}
]
},
{
"timestamp": "2021-10-31T16:29:18Z",
"result": [
{
"label": "Not Covered",
"value": 135
},
{
"label": "Active",
"value": 42
}
]
}
];
console.log(data.reduce((acc, {timestamp, result}) => {
const datum = result.reduce((acc, {label, value}) => {
acc[label] = value;
return acc;
}, {
timestamp,
'Not Covered': 0,
Active: 0,
'Expiring Soon': 0
});
return acc.concat(datum);
}, []));
Upvotes: 3
Reputation: 2955
What about something like this? You can then just put your "Active" and "ExpringSoon" according to your business logic.
const array = data.map(item => {
const results = {}
item.result.forEach(({ label, value }) => results[label] = value )
return {
Active: 0,
ExpiringSoon: 0,
timestamp: item.timestamp,
...results
}
})
Result
[
{
Active: 0,
ExpiringSoon: 0,
timestamp: '2021-08-31T15:29:18Z',
'Not Covered': 132
},
{
Active: 0,
ExpiringSoon: 0,
timestamp: '2021-09-30T15:29:18Z',
'Not Covered': 135
},
{
Active: 0,
ExpiringSoon: 0,
timestamp: '2021-10-31T16:29:18Z',
'Not Covered': 135
}
]
Upvotes: 2