I have an array of objects:
[{person:101, year: 2012}, {person:102, year: 2012}, {person:103, year: 2013}]
And I want to be able to return an
Use a generic group by key reducer that will count the number of items in each group. I will take inspiration from a previous answer of mine. This function will return another function that act as a reducer, but you can always give it the key that you want as a parameter.
const groupByCounter = key => (result,current) => {
const item = Object.assign({},current);
if (typeof result[current[key]] == 'undefined'){
result[current[key]] = 1;
}else{
result[current[key]]++;
}
return result;
};
const data = [{person:101, year: 2012}, {person:102, year: 2012}, {person:103, year: 2013}];
const group = data.reduce(groupByCounter('year'),{});
console.log(group);
You need to use simple for like below :
var data = [{person:101, year: 2011},
{person:102, year: 2012},
{person:103, year: 2011}];
var result = {},
i;
for(i=0; i < data.length; i++){
let year = data[i].year;
if(typeof result[year] === 'undefined'){
result[year] = 1;
}
else{
result[year] = result[year] + 1;
}
}
console.log(result);
As others have mentioned, an object would be a better fit for aggregating the data. You could use a normal loop, or reduce to do it:
var data = [{person:101, year: 2012}, {person:102, year: 2012}, {person:103,
year: 2013}];
var yearCounts = data.reduce(function (result, person) {
var currentCount = result[person.year] || 0;
result[person.year] = currentCount + 1;
return result;
}, {});
console.log(yearCounts);
If you really need it as an array, you could the loop over the object and convert it to an array:
var data = [{person:101, year: 2012}, {person:102, year: 2012}, {person:103,
year: 2013}];
var yearCounts = data.reduce(function (result, person) {
var currentCount = result[person.year] || 0;
result[person.year] = currentCount + 1;
return result;
}, {});
var year,
yearCountArray = [];
for (year in yearCounts) {
if (yearCounts.hasOwnProperty(year)) {
yearCountArray.push({
year: year,
count: yearCounts[year]
});
}
}
console.log(yearCountArray);