问题场景
在项目中有父子项关联的页面或者组织,每个子项根据业务的实际情况对树形数据进行勾选。保存后,每个子项可以单独查看自己勾选的数据,父项可以查看所有子项数据的合集,所以就需要对每个子项的树形数据进行合并并且将重复的数据进行去重,最终展示为一个完整测树形结构。
实现方法
原始数据(多个树形数据)
const arr1 = [
{
id: 1,
name: '1xx-xx',
children: [
{
id: 2,
name: '2xx-xx'
},
{
id: 5,
name: '5xx-xx',
children: [
{
id: 6,
name: '6xx-xx'
}
]
}
]
},
{
id: 3,
name: '3xx - xx'
}
];
const arr2 = [
{
id: 1,
name: '1xx-xx',
children: [
{
id: 2,
name: '2xx-xx'
}
]
},
{
id: 3,
name: '3xx - xx',
}
];
const arr3 = [
{
id: 3,
name: '3xx - xx',
children: [
{
id: 4,
name: '4xx - xx'
}
]
}
];
方法封装
function mergeTree(treeList: any[]) {
const newtree: any[] = [];
if (!treeList?.length) return treeList;
// 循环当前树
treeList.forEach((element) => {
const newItem = newtree.find(item => item.id === element.id);
if (newItem) {
// 如果当前项已经存在,那么当前项就不需要在push,需要将children数据进行合并 并去重
if (element.children) newItem.children = mergeTree([...(newItem?.children || []), ...element.children])
} else {
// 如果当前项不存在,将当前项push进新的数组
newtree.push({ ...element });
};
});
return newtree;
};
测试验证
const s = mergeTree([...arr1, ...arr2, ...arr3]);
console.log(s);
// 打印结果
// [
// {
// id: 1,
// name: '1xx-xx',
// children: [
// {
// id: 2,
// name: '2xx-xx'
// },
// {
// id: 5,
// name: '5xx-xx',
// children: [
// {
// id: 6,
// name: '6xx-xx'
// }
// ]
// }
// ]
// },
// {
// id: 3,
// name: '3xx - xx',
// children: [
// {
// id: 4,
// name: '4xx - xx'
// }
// ]
// }
// ];