Javascript JS-洛达斯;嵌套对象(父对象/子对象)到平面阵列

Javascript JS-洛达斯;嵌套对象(父对象/子对象)到平面阵列,javascript,arrays,nested,javascript-objects,lodash,Javascript,Arrays,Nested,Javascript Objects,Lodash,我正在使用lodash(虽然解决方案不必如此),我希望转换以下结构: { prop1: 'root', prop2: 'someVal', children: [ { prop1: 'first Child', prop2: 'some other val', children: [ { prop1: 'last child' prop2: 'another value' children: []

我正在使用lodash(虽然解决方案不必如此),我希望转换以下结构:

{ prop1: 'root',
  prop2: 'someVal',
  children: [
    { prop1: 'first Child',
      prop2: 'some other val',
      children: [
        { prop1: 'last child'
          prop2: 'another value'
          children: []
        }
      ]
    }
  ]
}
对于平面阵列:

[ { prop1: 'root', prop2: 'someVal' }, 
  {prop1: 'firstChild', prop2: 'some Other Val'}, 
  {prop1: 'last child', prop2: 'another value'}
]
深度可能会有所不同,最后一个子级总是将
[]
分配给其
子级
属性;请注意,在这种特殊情况下,子数组中始终只有一个项

应该是相当直接的,但似乎我只是不能把手指上的一些原因

谢谢

用这个片段(用咖啡脚本)解决了这个问题

使用纯JS的解决方案:-

这用于使用匿名目标将其展平(例如,
展平


这里是@jusopi解决方案的打字脚本版本

const flatten=(集合:any[],展平?:any[])=>{
如果(!展平){
平坦=[];
}
_.每个(集合,(obj)=>{
平推(obj);
展平(对象为儿童,展平);
});
返回平直;
};

在“严格模式”中,不允许参数.callee。在哪里定义了祖先?
flatten = (node) ->
        row = node
        _.each node.children or [], (el) ->
            flatten el
        ancestors.push row
var flatArray = function(input){
    var result = [];
    (function(obj){
        var arr = [], newObj = {};
        for (var key in obj) {
            if (obj.hasOwnProperty(key)) {
                if(key !== "children"){
                    newObj[key] = obj[key];
                }
                else{
                    arr = obj[key];
                }
            }
        }
        result.push(newObj);
        if(arr.length){
            arguments.callee(arr[0]);
        }
    })(input);
    return result;
};
flatten = (collection, flattened = [])->
  _.each collection, (obj)->
    flattened.push obj
    flatten obj.children, flattened
  flattened