Javascript 使用展平函数保持一致的parentId/id关系

Javascript 使用展平函数保持一致的parentId/id关系,javascript,node.js,reactjs,Javascript,Node.js,Reactjs,假设我有一个嵌套对象列表,如下所示: [{ "id": "a", "name": "Object a", "parentId": "root", "children": [{ "id": "c", "name": "Objec

假设我有一个嵌套对象列表,如下所示:

[{
    "id": "a",
    "name": "Object a",
    "parentId": "root",
    "children": [{
        "id": "c",
        "name": "Object c"
    },{
        "id": "d",
        "name": "Object D",
        "parentId": "a"
    }]
}, {
    "id": "b",
    "name": "Object b",
    "parentId": "root"
}]
对象解剖很简单:
id
name
子对象
(如果有)和
parentId
。我正在使用这个展平函数来转换嵌套对象 在平面阵列中:

函数展平(数组){
var结果=[];
array.forEach(函数(a){
结果:推(a);
if(Array.isArray(a.children)){
结果=结果.concat(展平(a.children));
}
});
返回结果;
}
问题是,
parentId
值并不总是对每个对象都保持不变,因此当对象展平到数组中时,可能会丢失父对象和子对象的关系

我需要
flatte
方法根据对象结构重建parentId值。这里只有一个问题,如果对象不是子对象,那么它的parentId应该是
root


非常感谢您的帮助

听起来您只需要将
parentId
添加到没有它们的对象中。改变

result = result.concat(flatten(a.children));


如果使用
root
parentId
调用root,则可以将parentId作为第二个参数传递给展平函数,如下所示,默认父对象仅为“root”

const arr=[{
“id”:“a”,
“名称”:“对象a”,
“父ID”:“根”,
“儿童”:[{
“id”:“c”,
“名称”:“对象c”
},{
“id”:“d”,
“名称”:“对象D”,
“父ID”:“a”
}]
}, {
“id”:“b”,
“名称”:“对象b”,
“父ID”:“根”
}]
函数展平(数组,parentId=“root”){
让结果=[];
array.forEach(函数(a){
a、 parentId=parentId;
结果:推(a);
if(Array.isArray(a.children)){
result=result.concat(展平(a.children,a.id));
}
删除a.children;//可选
});
返回结果;
}

控制台日志(展平(arr))如果我没有弄错,您只需要将结构展平为一个数组,以维护原始树中固有的
parentId
关系。如果是这样的话,我相信这样做可以:

constflatten=(xs,parentId='root')=>
xs.flatMap({children=[],id,…rest})=>[
{id,…rest,parentId},
…展平(儿童,id)
])
const input=[{id:“a”,name:“Object a”,parentId:“root”,children:[{id:“c”,name:“Object c”},{id:“d”,name:“Object d”,parentId:“a”}},{id:“b”,name:“Object b”,parentId:“root”}]
console.log(展平(输入))
。作为控制台包装{最大高度:100%!重要;顶部:0}
result = result.concat(flatten(a.children.map(addParent(a.parentId)));
const addParent = parentId => item => ({ ...item, parentId });