Reduce Nested array w lodash
by chridam
HTML
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.1.0/lodash.min.js"></script>
JavaScript
var data = [
{
name: "cat 1",
_id: 1,
children: [
{
name: "cat 1.1",
_id: 2,
parent: 1,
children: []
},
{
name: "cat 1.2",
_id: 3,
parent: 1,
children: [
{
name: "cat 1.2.1",
_id: 4,
parent: 3
},
{
name: "cat 1.2.2",
_id: 5,
parent: 3
}
]
}
]
},
{
name: "cat 2",
_id: 6,
children: []
}
];
const results = [];
_.each(data, (item) => {
var children = [];
_.each(item.children, (child) => {
var ancestors = [];
var grandchildren = [];
children.push(child._id);
ancestors.push(item._id);
results.push({
'name': child.name,
'parent': item._id,
'_id': child._id,
'ancestors': [item._id]
});
_.each(child.children, (grandchild) => {
grandchildren.push(grandchild._id);
if (ancestors.indexOf(child._id) < 0) ancestors.push(child._id);
results.push({
'name': grandchild.name,
'parent': child._id,
'_id': grandchild._id,
'ancestors': ancestors
});
});
});
results.push({
'name': item.name,
'children': children,
'_id': item._id
});
})
console.log("Flattened categories: \n", JSON.stringify(results, null, 4));