let animals = [ { id: 'animals', name: 'animals', parent: null }, { id: 'mammals', name: 'mammals', parent: 'animals' }, { id: 'mammals2', name: 'mammals2', parent: 'animals' }, { id: 'cats', name: 'cats', parent: 'mammals' }, { id: 'dogs', name: 'dogs', parent: 'mammals' }, { id: 'chihuahua', name: 'chihuahua', parent: 'dogs' }, { id: 'labrador', name: 'labrador', parent: 'dogs' }, { id: 'persian', name: 'persian', name: 'animals', parent: 'cats' }, { id: 'siamese', name: 'siamese', parent: 'cats' } ]
let isEmptyObject = (obj) => { for (let t in obj) return !1; return !0 }
let makeTree = (animals, parent) => { let node = {} let filters = animals.filter(c => c.parent === parent) if (filters.length) { filters.forEach(c => { node[c.id] = c n = makeTree(animals, c.id) node[c.id]['children'] = [] if (!isEmptyObject(n)) { node[c.id]['children'].push(n) } }) } return node }
console.log( JSON.stringify( makeTree(animals, null), null, 2 ) )
/** { "animals": { "id": "animals", "name": "animals", "parent": null, "children": [ { "mammals": { "id": "mammals", "name": "mammals", "parent": "animals", "children": [ { "cats": { "id": "cats", "name": "cats", "parent": "mammals", "children": [ { "persian": { "id": "persian", "name": "animals", "parent": "cats", "children": [] }, "siamese": { "id": "siamese", "name": "siamese", "parent": "cats", "children": [] } } ] }, "dogs": { "id": "dogs", "name": "dogs", "parent": "mammals", "children": [ { "chihuahua": { "id": "chihuahua", "name": "chihuahua", "parent": "dogs", "children": [] }, "labrador": { "id": "labrador", "name": "labrador", "parent": "dogs", "children": [] } } ] } } ] }, "mammals2": { "id": "mammals2", "name": "mammals2", "parent": "animals", "children": [] } } ] } } */