Javascript 将平面阵列转换为分层阵列
我在将平面列表转换为层次结构时遇到一些问题。 我试图从下面的数据中可视化d3.js树形图。 每个节点都有两个子对象,如Javascript 将平面阵列转换为分层阵列,javascript,d3.js,hierarchical-data,Javascript,D3.js,Hierarchical Data,我在将平面列表转换为层次结构时遇到一些问题。 我试图从下面的数据中可视化d3.js树形图。 每个节点都有两个子对象,如famsarray中所述 我在这里发现了与我的问题类似的问题,但我无法让它与两个父节点一起工作 这就是我想要归档的内容 我希望有人能给我指出正确的方向,提前谢谢 let nodes = [ { id: 'N001', fam: 'F001' }, { id: 'N002', fam: 'F002' }, { id: 'N003', fam: 'F003' }, { id: 'N0
fams
array中所述
我在这里发现了与我的问题类似的问题,但我无法让它与两个父节点一起工作
这就是我想要归档的内容
我希望有人能给我指出正确的方向,提前谢谢
let nodes = [
{ id: 'N001', fam: 'F001' },
{ id: 'N002', fam: 'F002' },
{ id: 'N003', fam: 'F003' },
{ id: 'N004', fam: 'F004' },
{ id: 'N005', fam: 'F005' },
{ id: 'N006', fam: 'F006' },
{ id: 'N007', fam: 'F007' },
{ id: 'N008', fam: 'F008' },
{ id: 'N009', fam: 'F009' },
{ id: 'N010', fam: 'F010' },
{ id: 'N011', fam: 'F011' }
];
let fams = [
{ id: 'F001', p1: 'N002', p2: 'N003' },
{ id: 'F002', p1: 'N004', p2: 'N005' },
{ id: 'F003', p1: 'N006', p2: 'N007' },
{ id: 'F004', p1: 'N008', p2: 'N009' },
{ id: 'F005', p1: 'N010', p2: 'N011' }
];
// Expected output
let finalData = [
{
id: 'N001',
children: [
{
id: 'N002',
fam: 'F002',
children: [
{
id: 'N004',
fam: 'F004',
children: [
{ id: 'N008', fam: 'F008' },
{ id: 'N009', fam: 'F009' }
]
},
{
id: 'N005',
fam: 'F005',
children: [
{ id: 'N010', fam: 'F010' },
{ id: 'N011', fam: 'F011' }
]
}
]
},
{
id: 'N003',
fam: 'F003',
children: [
{ id: 'N006', fam: 'F006' },
{ id: 'N007', fam: 'F007' }
]
}
]
}
];
一种可能的解决方案是循环
节点
数组,根据fams
,创建一个新属性(parentId
),该属性描述父属性(null
,如果没有):
之后,使用d3.stratify()
创建层次结构将非常简单:
const stratify = d3.stratify()(nodes);
以下是演示(使用浏览器的控制台检查结果,而不是s.O.代码段控制台):
let节点=[{
id:'N001',
fam:'F001'
},
{
id:'N002',
fam:'F002'
},
{
id:'N003',
fam:'F003'
},
{
id:'N004',
fam:'F004'
},
{
id:'N005',
fam:'F005'
},
{
id:'N006',
fam:'F006'
},
{
id:'N007',
fam:'F007'
},
{
id:'N008',
fam:'F008'
},
{
id:'N009',
fam:'F009'
},
{
id:'N010',
fam:'F010'
},
{
id:'N011',
fam:'F011'
}
];
让fams=[{
id:'F001',
p1:‘N002’,
p2:‘N003’
},
{
id:'F002',
p1:‘N004’,
p2:‘N005’
},
{
id:'F003',
p1:‘N006’,
p2:‘N007’
},
{
id:'F004',
p1:‘N008’,
p2:‘N009’
},
{
id:'F005',
p1:‘N010’,
p2:‘N011’
}
];
nodes.forEach(函数(d){
常量fam=fams.find(函数(e){
返回e.p1==d.id | | e.p2==d.id
});
d、 parentId=fam?nodes.find(函数(e){
返回e.fam==fam.id;
}).id:null;
});
const stratify=d3.stratify()(节点);
console.log(分层)
一种可能的解决方案是循环节点
数组,根据fams
,创建一个新属性(parentId
),该属性描述父属性(null
,如果没有):
之后,使用d3.stratify()
创建层次结构将非常简单:
const stratify = d3.stratify()(nodes);
以下是演示(使用浏览器的控制台检查结果,而不是s.O.代码段控制台):
let节点=[{
id:'N001',
fam:'F001'
},
{
id:'N002',
fam:'F002'
},
{
id:'N003',
fam:'F003'
},
{
id:'N004',
fam:'F004'
},
{
id:'N005',
fam:'F005'
},
{
id:'N006',
fam:'F006'
},
{
id:'N007',
fam:'F007'
},
{
id:'N008',
fam:'F008'
},
{
id:'N009',
fam:'F009'
},
{
id:'N010',
fam:'F010'
},
{
id:'N011',
fam:'F011'
}
];
让fams=[{
id:'F001',
p1:‘N002’,
p2:‘N003’
},
{
id:'F002',
p1:‘N004’,
p2:‘N005’
},
{
id:'F003',
p1:‘N006’,
p2:‘N007’
},
{
id:'F004',
p1:‘N008’,
p2:‘N009’
},
{
id:'F005',
p1:‘N010’,
p2:‘N011’
}
];
nodes.forEach(函数(d){
常量fam=fams.find(函数(e){
返回e.p1==d.id | | e.p2==d.id
});
d、 parentId=fam?nodes.find(函数(e){
返回e.fam==fam.id;
}).id:null;
});
const stratify=d3.stratify()(节点);
console.log(分层)
您似乎忘记添加您遇到问题的代码了。。?另外请注意,这个问题与。无关:祝贺D3问题编号35000。不管什么原因,人类都喜欢这些整数。看起来你忘记添加你遇到问题的代码了。。?另外请注意,这个问题与。无关:祝贺D3问题编号35000。不管什么原因,人类都喜欢这些整数。