You can use in-memory-faceted-search npm package to scan an array of objects and generate a faceted search index with all possible levels and combinations.
Example:
const data = require("./sample.json")
const facetedSearch = require("in-memory-faceted-search")
const facets = [
{ name: "Colors", field: "color" },
{ name: "Sizes", field: "size" },
{ name: "Status", field: "active", map: (item) => (item.active ? "Active" : "Disabled") },
{ name: "Ages", field: "age", map: (item) => (item.age > 25 ? "Over 25" : "Under 25") }
]
const tree = facetedSearch({ data, facets })
console.log(JSON.stringify(tree, null, 4))
Output:
{
"count": 100,
"Colors": {
"red": {
"count": 27
},
"blue": {
"count": 25
},
"green": {
"count": 23
},
"brown": {
"count": 25
}
},
"Sizes": {
"big": {
"count": 29
},
"small": {
"count": 34
},
"medium": {
"count": 37
}
},
"Status": {
"Disabled": {
"count": 56
},
"Active": {
"count": 44
}
},
"Ages": {
"Over 25": {
"count": 72
},
"Under 25": {
"count": 28
}
}
}
Check the README file to get more examples and deeper levels