I have a nested object where I not only want to count the number of times each point_name occurs, but I also want to count how many categories each point_name is in.
dat = [
{name: "Category 1", points: [ {point_name: "A"}, {point_name: "B"}, {point_name: "C"} ]},
{name: "Category 2", points: [ {point_name: "A"}, {point_name: "B"}, {point_name: "D"} ]},
{name: "Category 3", points: [ {point_name: "A"}, {point_name: "D"}, {point_name: "E"} ]},
{name: "Category 4", points: [ {point_name: "F"}, {point_name: "G"}, {point_name: "C"}, {point_name: "G"} ]},
{name: "Category 5", points: [ {point_name: "A"}, {point_name: "B"}, {point_name: "H"}, {point_name: "H"} ]}
]
Desired Output
[
{name: "A", count: 4, categories: 4},
{name: "B", count: 3, categories: 3},
{name: "C", count: 2, categories: 2},
{name: "D", count: 2, categories: 2},
{name: "G", count: 2, categories: 1},
{name: "H", count: 2, categories: 1},
{name: "E", count: 1, categories: 1},
{name: "F", count: 1, categories: 1}
]
What I've tried so far
I used a nested for loop to get all the point_names so I can use that in a reduce to count how many times each point_name occurs, but I can't figure out how to also count the number of categories each point_name is in.
// double loop to get each point name
let counts = []
for (let i = 0; i < dat.length; i++) {
for (let j = 0; j < dat[i].points.length; j++) {
counts.push(dat[i].points[j].point_name)
}
}
// count their unique values
let uniques = counts.reduce((acc, val) => {
acc[val] = acc[val] === undefined ? 1 : acc[val] += 1;
return acc;
}, {});
// turn into array of objects
return Array(Object.keys(uniques).length)
.fill()
.map((x, i) => ({ name: Object.keys(uniques)[i], count: Object.values(uniques)[i] }))
Any help appreciated!
