Akshay
Akshay

Reputation: 391

Frequency Counter in array of objects for certain key

I have an array of objects with students name which are getting repeated often. I want to create a frequency counter of the students name with the number of total counts.

Array :

arr = [
    {
        name: 'Akshay',
        age: '15',
    },
    {
        name: 'Rajat',
        age: '14',
    },
    {
        name: 'Akshay',
        age: '16',
    },
    {
        name: 'Sam',
        age: '12',
    },
    {
        name: 'Akshay',
        age: '11',
    },
    {
        name: 'Rajat',
        age: '17',
    },
    {
        name: 'Akshay',
        age: '12',
    },
    {
        name: 'Sam',
        age: '18',
    },
    {
        name: 'Sam',
        age: '19',
    }
    
]

I want to get the result like this in an array

result = [
    {
        name: 'Akshay',
        count: 4
    },
    {
        name: 'Rajat',
        count: 2
    },
    {
        name: 'Sam',
        count: 3
    },
]

I tried the below solution but it's not working properly -

const result = arr.reduce((counter,item) => {
    var getItem = item.name;
    counter[getItem] = counter.hasOwnProperty(getItem) ? counter[getItem] : 1;
    return counter;
})

Please help.

Upvotes: 0

Views: 44

Answers (2)

brk
brk

Reputation: 50291

You need to pass an accumulator in the reduce. In this case pass an empty object as an accumulator , so the accumulator will look like

{
 name:{
  name:someName,
  count:someCount
 },
 name2:{
  name:someName,
  count:someCount
  }
}

Once the accumulator is successfully populated, then use Object.values to get an array

const arr = [{
    name: 'Akshay',
    age: '15',
  },
  {
    name: 'Rajat',
    age: '14',
  },
  {
    name: 'Akshay',
    age: '16',
  },
  {
    name: 'Sam',
    age: '12',
  },
  {
    name: 'Akshay',
    age: '11',
  },
  {
    name: 'Rajat',
    age: '17',
  },
  {
    name: 'Akshay',
    age: '12',
  },
  {
    name: 'Sam',
    age: '18',
  },
  {
    name: 'Sam',
    age: '19',
  }

]

const result = arr.reduce((counter, item) => {
  var getItem = item.name;
  if (counter.hasOwnProperty(getItem)) {
    counter[getItem].count += 1;
  } else {
    counter[getItem] = {
      name: getItem,
      count: 1
    };

  }
  return counter;
}, {});

console.log(Object.values(result))

Upvotes: 1

AdriSolid
AdriSolid

Reputation: 2825

Try this: (you have been missing the initial value)

const count = arr.reduce((prev, cur) => {
  prev[cur.name] = (prev[cur.name] || 0) + 1;
  return prev;
}, {});

console.log(count);

Upvotes: 1

Related Questions