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));