JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>
JavaScript
var data = getData();
var group = getTree(data);
console.log(group);
function getTree(flat) {
return _.reduce(flat, function (treeObj, item, prop, flatTree) {
var children = _.map(item.children, function (childId) {
return _.set(flatTree[childId], 'isCategory', true);
}).concat(_.map(item.items, function(item) {
return _.set(item, 'isCategory', false);
}));
item.children = !!children.length ? children : null;
delete item.items;
item.parent === null && (treeObj[prop] = item);
return treeObj;
}, {});
}
function getData() {
return {
"1": {
"id": 1,
"name": "foo",
"parent": null,
"root": 1,
"children": [2, 4, 6],
"items": [{
"id": "1",
"name": "item1"
}, {
"id": "2",
"name": "item2"
}, {
"id": "3",
"name": "item3"
}]
},
"2": {
"id": 2,
"name": "bar",
"parent": 1,
"root": 1,
"children": null,
"items": [{
"id": "4",
"name": "item4"
}]
},
"3": {
"id": 3,
"name": "bazz",
"parent": null,
"root": 3,
"children": [5, 7],
"items": [{
"id": "5",
"name": "item5"
}, {
"id": "6",
"name": "item6"
}]
},
"4": {
"id": 4,
"name": "zap",
"parent": 1,
"root": 1,
"children": [9],
"items": [{
"id": "7",
"name": "item7"
}, {
...