-3

I have an array with objects. It looks like this

const data = [{name: "Jeslord Thompson", house: "9", class: "2G"},
{name: "Michael Norman", house: "9", class: "3B2"},
{name: "Prince Asiedu", house: "9", class: "1D2"},
{name: "Ronald Eyeson", house: "9", class: "3D3"},
{name: "Ernest Essien", house: "9", class: "2F"},
{name: "Kalikrates", house: "9", class: "1H"},
{name: "Michael Sungnuma", house: "9", class: "2D3"},
{name: "Alidu Wonzooya", house: "9", class: "2E"},
{name: "Shadrach Achambaka", house: "9", class: "2G"},
{name: "Fidel Taylor", house: "9", class: "2P"},
{name: "Emmanuel Buabeng", house: "9", class: "2G"},
{name: "Clement Davour", house: "9", class: "2G"},
{name: "Kingsley Buadi", house: "9", class: "3N"},
{name: "Lommo", house: "9", class: "3H"},
{name: "Jeslord Thompson", house: "9", class: "2G"},
{name: "Michael Norman", house: "9", class: "3B2"},
{name: "Prince Asiedu", house: "9", class: "1D2"},
{name: "Ronald Eyeson", house: "9", class: "3D3"},
{name: "Ernest Essien", house: "9", class: "2F"},
{name: "Kalikrates", house: "9", class: "1H"},
{name: "Michael Sungnuma", house: "9", class: "2D3"},
{name: "Alidu Wonzooya", house: "9", class: "2E"},
{name: "Shadrach Achambaka", house: "9", class: "2G"},
{name: "Fidel Taylor", house: "9", class: "2P"},
{name: "Emmanuel Buabeng", house: "9", class: "2G"},
{name: "Clement Davour", house: "9", class: "2G"}]

What, I want is to be able to count the number of times each name appears in the array and get an array like this for every name in the array above in this format.

[{name: "Jeslord Thompson", count:2}]

This is my attempt

names = data.map(arr => arr.name)

for(var i = 0; i< names.length; i++){
 for(var j = i+1; i<names.length; i++){
    if (names[i] === names[j]){

But I'm stuck, and still thinking of what to do

  • 5
    have you tried anything ? – Kunal Mukherjee Aug 16 '20 at 16:01
  • This is common use-case for [Array.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce). The documentation literally includes [an example](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Counting_instances_of_values_in_an_object) titled "Counting instances of values in an object" that counts the number of times a name occurs in an array. – ray Aug 16 '20 at 16:03
  • See the MDN [link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Counting_instances_of_values_in_an_object) – Kunal Mukherjee Aug 16 '20 at 16:06
  • This can help you https://stackoverflow.com/questions/37565828/javascript-code-to-get-count-of-occurrence-of-objects-in-array-of-objects-using – Harmandeep Singh Kalsi Aug 16 '20 at 16:08
  • @KunalMukherjee, yes I'm trying something like this names = data.map(arr => arr.name) for(var i = 0; i< names.length; i++){ for(var j = i+1; i – Tariq Sulley Aug 16 '20 at 16:09
  • Add the attempt in your question, maybe can take a look – Kunal Mukherjee Aug 16 '20 at 16:09
  • @HarmandeepSinghKalsi, I get {undefined: 26} when I use the code in the link you attached. – Tariq Sulley Aug 16 '20 at 16:11
  • Please add to the question you code , what you tried – Harmandeep Singh Kalsi Aug 16 '20 at 16:12

2 Answers2

0

const data = [{
    name: "Jeslord Thompson",
    house: "9",
    class: "2G"
  },
  {
    name: "Michael Norman",
    house: "9",
    class: "3B2"
  },
  {
    name: "Prince Asiedu",
    house: "9",
    class: "1D2"
  },
  {
    name: "Ronald Eyeson",
    house: "9",
    class: "3D3"
  },
  {
    name: "Ernest Essien",
    house: "9",
    class: "2F"
  },
  {
    name: "Kalikrates",
    house: "9",
    class: "1H"
  },
  {
    name: "Michael Sungnuma",
    house: "9",
    class: "2D3"
  },
  {
    name: "Alidu Wonzooya",
    house: "9",
    class: "2E"
  },
  {
    name: "Shadrach Achambaka",
    house: "9",
    class: "2G"
  },
  {
    name: "Fidel Taylor",
    house: "9",
    class: "2P"
  },
  {
    name: "Emmanuel Buabeng",
    house: "9",
    class: "2G"
  },
  {
    name: "Clement Davour",
    house: "9",
    class: "2G"
  },
  {
    name: "Kingsley Buadi",
    house: "9",
    class: "3N"
  },
  {
    name: "Lommo",
    house: "9",
    class: "3H"
  },
  {
    name: "Jeslord Thompson",
    house: "9",
    class: "2G"
  },
  {
    name: "Michael Norman",
    house: "9",
    class: "3B2"
  },
  {
    name: "Prince Asiedu",
    house: "9",
    class: "1D2"
  },
  {
    name: "Ronald Eyeson",
    house: "9",
    class: "3D3"
  },
  {
    name: "Ernest Essien",
    house: "9",
    class: "2F"
  },
  {
    name: "Kalikrates",
    house: "9",
    class: "1H"
  },
  {
    name: "Michael Sungnuma",
    house: "9",
    class: "2D3"
  },
  {
    name: "Alidu Wonzooya",
    house: "9",
    class: "2E"
  },
  {
    name: "Shadrach Achambaka",
    house: "9",
    class: "2G"
  },
  {
    name: "Fidel Taylor",
    house: "9",
    class: "2P"
  },
  {
    name: "Emmanuel Buabeng",
    house: "9",
    class: "2G"
  },
  {
    name: "Clement Davour",
    house: "9",
    class: "2G"
  }
]

let result = [];

data.forEach((item) => {
  let resultData = {
    name: item.name,
    count: 0
  }
  let count = data.filter((contact) => {
    return contact.name === item.name;
  });
  resultData.count = count.length;
  result.push(resultData);
});

console.log(result);

Please support with marked as answer if it helps you, thanks.

Umutambyi Gad
  • 4,082
  • 3
  • 18
  • 39
Rahul Beniwal
  • 639
  • 4
  • 9
0

Use Array#reduce to get the structure for each name as property of the new object and then Object#values to convert it to an array.

let arr = [{name: "Jeslord Thompson", house: "9", class: "2G"},
{name: "Michael Norman", house: "9", class: "3B2"},
{name: "Prince Asiedu", house: "9", class: "1D2"},
{name: "Ronald Eyeson", house: "9", class: "3D3"},
{name: "Ernest Essien", house: "9", class: "2F"},
{name: "Kalikrates", house: "9", class: "1H"},
{name: "Michael Sungnuma", house: "9", class: "2D3"},
{name: "Alidu Wonzooya", house: "9", class: "2E"},
{name: "Shadrach Achambaka", house: "9", class: "2G"},
{name: "Fidel Taylor", house: "9", class: "2P"},
{name: "Emmanuel Buabeng", house: "9", class: "2G"},
{name: "Clement Davour", house: "9", class: "2G"},
{name: "Kingsley Buadi", house: "9", class: "3N"},
{name: "Lommo", house: "9", class: "3H"},
{name: "Jeslord Thompson", house: "9", class: "2G"},
{name: "Michael Norman", house: "9", class: "3B2"},
{name: "Prince Asiedu", house: "9", class: "1D2"},
{name: "Ronald Eyeson", house: "9", class: "3D3"},
{name: "Ernest Essien", house: "9", class: "2F"},
{name: "Kalikrates", house: "9", class: "1H"},
{name: "Michael Sungnuma", house: "9", class: "2D3"},
{name: "Alidu Wonzooya", house: "9", class: "2E"},
{name: "Shadrach Achambaka", house: "9", class: "2G"},
{name: "Fidel Taylor", house: "9", class: "2P"},
{name: "Emmanuel Buabeng", house: "9", class: "2G"},
{name: "Clement Davour", house: "9", class: "2G"}];

let result = Object.values(arr.reduce((acc, {name}) => {
    if (acc[name] === undefined)
        acc[name] = {name: name, count: 1};
    else
        acc[name].count++;
    return acc;
},{}));

console.log(result);
Sascha
  • 4,576
  • 3
  • 13
  • 34