Jan :
I have an array of js objects which look like this:
var objArr = [
{"Country": "US", "City": "MyCity1", "2017-07-12": "1", "2017-07-13": "2"},
{"Country": "US", "City": "MyCity2", "2017-07-12": "2", "2017-07-13": "2"},
{"Country": "CN", "City": "MyCity1", "2017-07-12": "5", "2017-07-13": "7"},
{"Country": "CN", "City": "MyCity2", "2017-07-12": "5", "2017-07-13": "7"}
]
I wanna create a new array where the country is unique, but also the dates should be summed.
{"Country": "US", "2017-07-12": "3", "2017-07-13": "4"},
{"Country": "CN", "2017-07-12": "10", "2017-07-13": "14"}
^^^^ ^^^^ ^^^^
I have problems getting my head around it. Do I have to filter first, reduce it somehow, remap it,... I've no idea to start? Any help would be appreciated, thank you!
Siva Kondapi Venkata :
Use one forEach
for array and go over each object date keys using forEach
and build the one res
object with unique keys as Country
and accumulated values. Use Object.values
of res to get the array from res object.
Update: Fix to make sure always one type for dates which is number
.
var objArr = [
{ Country: "US", City: "MyCity1", "2017-07-12": "1", "2017-07-13": "2" },
{ Country: "US", City: "MyCity2", "2017-07-12": "2", "2017-07-13": "2" },
{ Country: "CN", City: "MyCity1", "2017-07-12": "5", "2017-07-13": "7" },
{ Country: "CN", City: "MyCity2", "2017-07-12": "5", "2017-07-13": "7" }
];
const update = data => {
const res = {};
data.forEach(({ Country, City, ...dates }) => {
const item = res[Country] || { Country };
Object.keys(dates).forEach(date => {
item[date] = (item[date] || 0) + Number(dates[date]);
});
res[Country] = { ...item };
});
return Object.values(res);
};
console.log(update(objArr));