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 });