Group by count of objects within an array in Vanilla Javascript

前端 未结 3 1470
清酒与你
清酒与你 2021-01-29 00:17

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

相关标签:
3条回答
  • 2021-01-29 00:39

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

    0 讨论(0)
  • 2021-01-29 00:45

    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);
    
    0 讨论(0)
  • 2021-01-29 00:46

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

    0 讨论(0)
提交回复
热议问题