var getStructureTree = function getStructureTree(highLevelArray, leftArray) { if (leftArray.length) { var subLeft = leftArray; highLevelArray.map(function(v) { v.subcategories.map(function(value, key) { v.subcategories[key].subcategories = leftArray.filter(function(subValue) { if (subValue.parent === value.id) { _.remove(subLeft, subValue); } return subValue.parent === value.id; }); }) }); console.log('subLeft', subLeft); //getStructureTree(highLevelArray, subLeft); } return highLevelArray; } var categories = [{id:1, parent:null},{id:2, parent:1},{id:3, parent:null}, {id:4, parent:2},{id:5, parent:2},{id:6, parent:3}, {id:7, parent:null},{id:8, parent:7},{id:9, parent:5}]; var topParentCategories = categories.filter(function(value) { return value.parent === null; }); var categoriesLeft = categories.filter(function(value) { return value.parent !== null; }); var subLeft = categoriesLeft; topParentCategories.map(function(value, key) { topParentCategories[key].subcategories = categoriesLeft.filter(function(subValue) { if (subValue.parent === value.id) { _.remove(subLeft, subValue); } return subValue.parent === value.id; }); }); console.log('subLeft', subLeft); getStructureTree(topParentCategories, subLeft); console.log('topParentCategories', topParentCategories);