Javascript 如何重新构造此数据以匹配它';原始的未展平形状是什么?

Javascript 如何重新构造此数据以匹配它';原始的未展平形状是什么?,javascript,underscore.js,Javascript,Underscore.js,我有以下数据模型: 新车型 [ { name : 'Tony', id : 'Tony_id' },{ name: 'Barry', id: 'Barry_id', parentId: 'Tony_id' },{ name: 'George', id: 'George_id',

我有以下数据模型:

新车型

[
        {
            name : 'Tony',
            id : 'Tony_id'
        },{
            name: 'Barry',
            id: 'Barry_id',
            parentId: 'Tony_id'
        },{
            name: 'George',
            id: 'George_id',
            parentId: 'Barry_id'
        },{
            name : 'Laura',
            id : 'Laura_id',
            parentId: 'Barry_id'
        },{
            name: 'Edward',
            id: 'Edward_id'
        },{
            name: 'Patrick',
            id: 'Patrick_id',
            parentId: 'Edward_id'
        }
   ]
   [

        {
            name : 'Tony',
            id : 'Tony_id',
            children: [
                {
                    name: 'Barry',
                    id: 'Barry_id',
                    parentId: 'Tony_id',
                    children: [
                        {
                            name: 'George',
                            id: 'George_id',
                            parentId: 'Barry_id'
                        },{
                            name : 'Laura',
                            id : 'Laura_id',
                            parentId: 'Barry_id'
                        }
                    ]
                }
            ]
        },{
            name: 'Edward',
            id: 'Edward_id',
            children: [
                {
                    name: 'Patrick',
                    id: 'Patrick_id',
                    parentId: 'Edward_id'
                 }
            ]
        }
   ]
因此,结构是父母、子女和孙子孙女。最初模型看起来如下所示,但我不得不将其展平:

旧款

[
        {
            name : 'Tony',
            id : 'Tony_id'
        },{
            name: 'Barry',
            id: 'Barry_id',
            parentId: 'Tony_id'
        },{
            name: 'George',
            id: 'George_id',
            parentId: 'Barry_id'
        },{
            name : 'Laura',
            id : 'Laura_id',
            parentId: 'Barry_id'
        },{
            name: 'Edward',
            id: 'Edward_id'
        },{
            name: 'Patrick',
            id: 'Patrick_id',
            parentId: 'Edward_id'
        }
   ]
   [

        {
            name : 'Tony',
            id : 'Tony_id',
            children: [
                {
                    name: 'Barry',
                    id: 'Barry_id',
                    parentId: 'Tony_id',
                    children: [
                        {
                            name: 'George',
                            id: 'George_id',
                            parentId: 'Barry_id'
                        },{
                            name : 'Laura',
                            id : 'Laura_id',
                            parentId: 'Barry_id'
                        }
                    ]
                }
            ]
        },{
            name: 'Edward',
            id: 'Edward_id',
            children: [
                {
                    name: 'Patrick',
                    id: 'Patrick_id',
                    parentId: 'Edward_id'
                 }
            ]
        }
   ]
我把旧型号的任何参考资料都弄丢了


仅使用新模型,如何重构它以匹配我的旧模型,取消展平它?

您可以递归执行:

var newData=[
{
姓名:“托尼”,
id:“Tony_id”,
儿童:[
{
姓名:'巴里',
id:“巴里·迪德”,
parentId:“Tony_id”,
儿童:[
{
姓名:'乔治',
id:'乔治_id',
parentId:“Barry_id”
},{
名字:“劳拉”,
身份证:“劳拉”,
parentId:“Barry_id”
}
]
}
]
},{
姓名:'爱德华',
id:'爱德华(爱德华)id',
儿童:[
{
姓名:'帕特里克',
id:“Patrick_id”,
parentId:“Edward\u id”
}
]
}
];
功能展开(数据,展开){
data.forEach(el=>{
平推(el);
如果(儿童){
平坦(el.儿童,平坦);
删除el.children;
}
});
}
var展平=[];
平坦(新数据,平坦);

控制台日志(展平)您可以用一个对象构建一棵树,以保持父子关系

此建议也适用于未排序的数据

var data=[{name:'Tony',id:'Tony_id'},{name:'Barry',id:'Barry_id',parentId:'Tony_id'},{name:'George',id:'George_id',parentId:'Barry_id'},{name:'Edward id:'Edward_id'},{name:'Patrick',id:'Patrick_id',parentId:'Edward,
树=函数(数据,根){
var r=[],o={};
data.forEach(函数(a){
if(o[a.id]&&o[a.id].儿童){
a、 children=o[a.id]&&o[a.id];
}
o[a.id]=a;
if(a.parentId==根){
r、 推(a);
}否则{
o[a.parentId]=o[a.parentId]|{};
o[a.parentId]。children=o[a.parentId]。children | |[];
o[a.parentId].children.push(a);
}
});
返回r;
}(数据,未定义);
控制台日志(树);
控制台日志(结果)
。作为控制台包装{最大高度:100%!重要;顶部:0;}
和(为了好玩),相反:

让旧数据=[
{姓名:'Tony',id:'Tony_id'},
{name:'Barry',id:'Barry_id',parentId:'Tony_id'},
{姓名:'George',id:'George_id',家长id:'Barry_id'},
{姓名:'Laura',身份证:'Laura_id',父母身份证:'Barry_id'},
{姓名:'Edward',身份证:'Edward_id'},
{name:'Patrick',id:'Patrick_id',parentId:'Edward_id'}
]
//首先,我们需要一个具有以下内容的关键数据对象:
//关键字:个人id
//价值:个人数据
设dwKeys={}
forEach(d=>dwKeys[d.id]=d);
//和孩子们一样的东西
让dwChildren={};
//这样我们就能知道谁是谁了
for(让uid输入dwKeys)
{
//我们获取此人的数据
设udata=dwKeys[uid];
//我们接受父母(如果有的话)
让parentId=udata.parentId;
//没有家长?确定=>根用户
如果(!parentId){
dwChildren[uid]=udata;
继续;
} 
//现在,我们将子对象添加到其父对象
//如果需要,做记录
如果(未定义===dwChildren[parentId]){
dwChildren[parentId]=dwKeys[parentId];
}
//如果需要,孩子们是否在场
if(未定义===dwChildren[parentId]['children']){
dwChildren[parentId]['children']=[];
}
//添加此子项
删除udata.parentId;
dwChildren[parentId]['children'].push(udata);
}
//嘿,不,它不起作用:
//dwChildren=dwChildren.values();
//因此:
让awChildren=[];//用于“带子对象的数组”
for(让uid在dwChildren中){awChildren.push(dwChildren[uid])中
console.log(awChildren)

作为控制台包装{max height:100%!important;top:0;}
到目前为止您做了什么你考虑过使用递归reduce吗?@evolutionxbox不,我对这一个感到非常困惑。我不确定如何像这样取消展平数据。你可能面临的一个大问题是,如果你有一个循环的“父”引用。对不起,看起来你是在展平数据?也许我的问题不清楚,但我实际上想做相反的事情你想要这棵树吗?是的,目前我的数据是平的,我想做相反的事情。我看到你编辑了你的答案,非常感谢尼娜!非常感谢!我很感激你的回答,但看起来你是在平展数据?也许我的问题不清楚,但实际上我正想做相反的事情。