Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Array of objects: Count occurrences of a unique property in JavaScript

Given a sample JSON array of objects, like this….

[
  {
    "firstName": "Bob",
    "lastName": "Smith",
    "city": "Preston",
    "st": "Florida",
    "age": 15
  },
  {
    "firstName": "Tom",
    "lastName": "Jones",
    "city": "Springfield",
    "st": "Illinois",
    "age": 34
  },
  {
    "firstName": "Mary",
    "lastName": "Hart",
    "city": "Miami",
    "st": "Florida",
    "age": 22
  },
  {
    "firstName": "Jenny",
    "lastName": "Dixon",
    "city": "Palm City",
    "st": "Florida",
    "age": 26
  }
]

What is the best way to get the number of occurrences based on the groupings of a particular property? So, let’s say I want to produce a JSON object that has each unique state ("st") and the number of occurrences….

[
  {
    "st": "Illinois",
    "count": 1
  },
  {
    "st": "Florida",
    "count": 3
  }
]

I can do it manually using a for-let, looping through the array, tracking the values as I loop, etc. But I’m sure there’s a more efficient way using ES6. Can you please help me out? Thanks.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

You can use Array#reduce to keep a tally

let counts = json.reduce((b, a) => {
  let index = b.findIndex(j => j.st === a.st);
  if (index > -1) b[index].count++;
  else b.push({st: a.st, count: 1});
  return b;
}, [])

#UPDATE: As mentioned by @epascarello, there is a more efficient way to go about this, removing the findIndex loop and using Object.values

const results = Object.values(json.reduce((obj, item) => {
   obj[item.st] = obj[item.st] || { st: item.st, count: 0 };
   obj[item.st].count++;       
   return obj;}, {}))
let json = [{
    "firstName": "Bob",
    "lastName": "Smith",
    "city": "Preston",
    "st": "Florida",
    "age": 15
  },
  {
    "firstName": "Tom",
    "lastName": "Jones",
    "city": "Springfield",
    "st": "Illinois",
    "age": 34
  },
  {
    "firstName": "Mary",
    "lastName": "Hart",
    "city": "Miami",
    "st": "Florida",
    "age": 22
  },
  {
    "firstName": "Jenny",
    "lastName": "Dixon",
    "city": "Palm City",
    "st": "Florida",
    "age": 26
  }
]

let counts = json.reduce((b, a) => {
  let index = b.findIndex(j => j.st === a.st);
  if (index > -1) b[index].count++;
  else b.push({st: a.st, count: 1});
  return b;
}, [])

console.log(counts)

const results = Object.values(json.reduce((obj, item) => {
obj[item.st] = obj[item.st] || { st: item.st, count: 0 };
obj[item.st].count++;       
return obj;}, {}))

console.log(results)
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading