简体   繁体   中英

How to count number of occurrences of distinct values from an array of objects in Javascript?

I have an array of objects like below:

var array =
    [
        {"name":"abc","age":20}
        {"name":"abc","age":20}
        {"name":"abc","age":20}
        {"name":"xyz","age":21}
        {"name":"xyz","age":21}
    ]

I want to count the number of occurrences of distinct values like:

[3,2]

Assuming abc has 3 occurrences and xyz has 2 occurrences.

I am doing it in reactjs . I am able to get distinct values like [abc,xyz] using this answer .

ES6 syntax is preferred.

You'll need to know to which name a count belongs, so I propose not to output an array that gives you no clue about that, but an object keyed by names and with as value the corresponding count:

var result = array.reduce( (acc, o) => (acc[o.name] = (acc[o.name] || 0)+1, acc), {} );

 var array = [ {"name":"abc","age":20}, {"name":"abc","age":20}, {"name":"abc","age":20}, {"name":"xyz","age":21}, {"name":"xyz","age":21} ]; var result = array.reduce( (acc, o) => (acc[o.name] = (acc[o.name] || 0)+1, acc), {} ); console.log(result);

Map/Reduce to the rescue:

const frequency = array
  .map(({ name }) => name)
  .reduce((names, name) => {
    const count = names[name] || 0;
    names[name] = count + 1;
    return names;
  }, {});

// frequency: { abc: 3, xyz: 2 }

You can use forEach/map to iterate the array and store the count in another variable, Check this:

 var array = [ {"name" : "abc", "age" : 20}, {"name" : "abc", "age" : 20}, {"name" : "abc", "age" : 20}, {"name" : "xyz", "age" : 21}, {"name" : "xyz", "age" : 21}, ]; let b = {}; array.forEach(el => { b[el.name] = (b[el.name] || 0) + 1; }) console.log(b);

Quick answer : new Set(array).size .

Explanation (From MDN Web Docs):

The Set object lets you store unique values of any type, whether primitive values or object references

Still if anyone looking for distinct counts stored in an array

var result = array.reduce( (acc, o) => (acc[o.name] = (acc[o.name] || 0)+1, acc), {} );
result = Object.values(result); // returns an array of values from the object
// result will be [3,2]

This is one way to do it:

 var array = [ {"name":"abc","age":20}, {"name":"abc","age":20}, {"name":"abc","age":20}, {"name":"xyz","age":21}, {"name":"xyz","age":21} ] let yy = {} array.map( el => { yy[el.name] = (yy[el.name] || 0) + 1 }) console.log(yy)

And this is another way:

 var array = [ {"name":"abc","age":20}, {"name":"abc","age":20}, {"name":"abc","age":20}, {"name":"xyz","age":21}, {"name":"xyz","age":21} ] let yy = {} array.map( el => { if (yy[el.name] === undefined || yy[el.name] === 0) { yy[el.name] = 1 } else { yy[el.name] = yy[el.name] + 1 } }) console.log(yy)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM