Reputation: 3109
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.
Upvotes: 8
Views: 17799
Reputation: 755
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)
Upvotes: 0
Reputation: 771
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]
Upvotes: 0
Reputation: 1586
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
Upvotes: -1
Reputation: 104369
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);
Upvotes: 4
Reputation: 26696
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 }
Upvotes: 6
Reputation: 350147
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);
Upvotes: 25