Skip to content Skip to sidebar Skip to footer

Group By Count Of Objects Within An Array In Vanilla Javascript

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 aggregate count for each year (much

Solution 1:

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);

Solution 2:

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);

Solution 3:

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.

constgroupByCounter = 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);

Post a Comment for "Group By Count Of Objects Within An Array In Vanilla Javascript"