Published
Edited
Apr 6, 2022
Insert cell
# Counting Nested Data
Insert cell
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"} ]}
]
Insert cell
Insert cell
// TODO
{

// 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] }))

}
Insert cell
Insert cell
// 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}
]
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more