Javascript JS-洛达斯;嵌套对象(父对象/子对象)到平面阵列
我正在使用lodash(虽然解决方案不必如此),我希望转换以下结构: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: []
{ 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