展平javascript对象数组

展平javascript对象数组,javascript,underscore.js,lodash,flatten,Javascript,Underscore.js,Lodash,Flatten,我有一个具有层次结构的对象数组,如下所示: [ {name: 'ParentOne', children: [ {name: 'ParentOneChildOne'}, {name: 'ParentOneChildTwo', children: [ {name: 'ParentOneChildTwoGrandChildOne'}, ]}, ]}, {name: 'ParentTwo', childr

我有一个具有层次结构的对象数组,如下所示:

[
    {name: 'ParentOne', children: [
        {name: 'ParentOneChildOne'},
        {name: 'ParentOneChildTwo', children: [
            {name: 'ParentOneChildTwoGrandChildOne'},
        ]},
    ]}, 
    {name: 'ParentTwo', children: [
        {name: 'ParentTwoChildOne', children: [
           {name: 'ParentTwoChildOneGrandChildOne'},
           {name: 'ParentTwoChildOneGrandChildTwo'}
        ]},
        {name: 'ParentTwoChildTwo'}
    ]}
];
我想把它展平:

[
    {name: 'ParentOne'},
    {name: 'ParentOneChildOne'},
    {name: 'ParentOneChildTwo'},
    {name: 'ParentOneChildTwoGrandChildOne'},
    {name: 'ParentTwo'},
    {name: 'ParentTwoChildOne'},
    {name: 'ParentTwoChildOneGrandChildOne'},
    {name: 'ParentTwoChildOneGrandChildTwo'},
    {name: 'ParentTwoChildTwo'}
]

我试过
.flatte()
.flatMap()
,但它不能产生我需要的东西。最好使用lodash.js下划线.js实现它的最佳方法是什么

const arr=[
{名称:'ParentOne',子项:[
{name:'ParentOneChildOne'},
{name:'ParentOneChildTwo',子项:[
{name:'parentOneChildTwo孙子'},
]},
]}, 
{名称:'ParentTwo',子项:[
{name:'ParentTwoChildOne',子项:[
{name:'parentTwoChildone孙子女'},
{name:'parentTwoChildOne孙子2'}
]},
{name:'ParentTwoChildTwo'}
]}
];
函数展平(arr){
返回arr?arr.reduce((结果,项目)=>[
…结果,
{name:item.name},
…展平(项。子项)
], []) : [];
}

控制台日志(展平(arr))我会使用
.reduce
和递归来实现这一点。下面是我使用Array.reduce的实现,但您也可以使用下划线的reduce函数来实现

const arr=[
{名称:'ParentOne',子项:[
{name:'ParentOneChildOne'},
{name:'ParentOneChildTwo',子项:[
{name:'parentOneChildTwo孙子'},
]},
]}, 
{名称:'ParentTwo',子项:[
{name:'ParentTwoChildOne',子项:[
{name:'parentTwoChildone孙子女'},
{name:'parentTwoChildOne孙子2'}
]},
{name:'ParentTwoChildTwo'}
]}
];
函数展平(arr){
返回arr.reduce((结果,当前)=>{
if(当前的子项){
const children=flatten(当前的children.children);
删除当前的.children;
结果:推送(电流);
结果:推挤(…儿童);
}否则{
结果:推送(电流);
}
返回结果;
}, [])
}

控制台日志(展平(arr))
您可以尝试调整中给出的
展平
函数,并稍微扭曲逻辑以适应对象的结构

//您的对象
风险值数据=[{
姓名:'ParentOne',
儿童:[{
姓名:'ParentOneChildOne'
},
{
姓名:“ParentOneChildTwo”,
儿童:[{
姓名:“ParentOneChildTwo孙子女”
}, ]
},
]
},
{
姓名:'ParentTwo',
儿童:[{
姓名:'ParentTwoChildOne',
儿童:[{
姓名:“ParentTwoChildone孙子女”
},
{
姓名:“ParentTwoChildone孙子2”
}
]
},
{
姓名:“ParentTwoChildTwo”
}
]
}
];
//格奥尔格展平函数
展平=函数(x,结果,前缀){
如果(u.等标(x)){
_.每个(x,函数(v,k){
展平(v,结果,前缀?前缀+'.'+k:k)
})
}否则{
结果[前缀]=x
}
返回结果
}
//在数据上使用函数
结果=展平(数据,{});
控制台日志(结果)

无论迭代的深度如何,递归函数都是可行的

带有一些ES2015和LoDash/下划线

var-arr=[{
姓名:'ParentOne',
儿童:[{
姓名:'ParentOneChildOne'
}, {
姓名:“ParentOneChildTwo”,
儿童:[{
姓名:“ParentOneChildTwo孙子女”
}, ]
}, ]
}, {
姓名:'ParentTwo',
儿童:[{
姓名:'ParentTwoChildOne',
儿童:[{
姓名:“ParentTwoChildone孙子女”
}, {
姓名:“ParentTwoChildone孙子2”
}]
}, {
姓名:“ParentTwoChildTwo”
}]
}];
var res=u0.reduce(arr,(a,b)=>{
(rec=项目=>{
_.每个(项目,(v,k)=>(项目(v)?记录(v):推送(项目(k),[v]))
})(b) );
返回a;
}, []);
控制台日志(res)

您可以使用一些销毁并使用递归函数来收集所有需要的物品

var数组=[{name:'ParentOne',children:[{name:'ParentOneChildOne'},{name:'parentonechildrentworneone'},]},[{name:'ParentOne',children:[{name:'parentonechildrentworneone'},{name:'parentonechildrentwornetwornetwornetwornetwo'},]},[{name:'parentwochildrentwornetwornetwornetwornetwo'},{name:'ParentTwoChildTwo'}]},
flat=(r,{name,children=[]})=>[…r,{name},…children.reduce(flat,[]]),
结果=数组.reduce(平坦,[]);
console.log(结果);
。作为控制台包装{最大高度:100%!重要;顶部:0;}