const treeData = [
{
title: '0-0',
key: '0-0',
children: [
{
title: '0-0-0',
key: '0-0-0',
children: [
{ title: '0-0-0-0', key: '0-0-0-0' },
{ title: '0-0-0-1', key: '0-0-0-1' },
{ title: '0-0-0-2', key: '0-0-0-2', children: [{title: '0-0-0-0-0', key: '0-0-0-0-0'}] },
],
},
{
title: '0-0-1',
key: '0-0-1',
children: [
{ title: '0-0-1-0', key: '0-0-1-0' },
{ title: '0-0-1-1', key: '0-0-1-1' },
{ title: '0-0-1-2', key: '0-0-1-2' }
],
},
{
title: '0-0-2',
key: '0-0-2',
}
],
},
{
title: '0-1',
key: '0-1',
children: [
{ title: '0-1-0-0', key: '0-1-0-0' },
{ title: '0-1-0-1', key: '0-1-0-1' },
{ title: '0-1-0-2', key: '0-1-0-2' },
]
},
{
title: '0-2',
key: '0-2',
}
];
// 1. 为子节点添加父级的key
function addParentKeyWrapper (tree) {
const data = JSON.parse(JSON.stringify(tree)); // 深度克隆(deepClone)
function addParentKey(data, parentKey) {
data.forEach(ele => {
const { children, key } = ele;
ele.parent = parentKey;
if (children){
addParentKey(children, key);
}
})
}
addParentKey(data, null); // 一开始的时候是null
return data;
}
// 2.给了树中间的某个节点,如何去寻找该节点所有的父级节点呢?
// 答案是:把树拉平。(每个节点之间的联系依靠parentKey属性)
function flattenTreeDataClosure(data){
const treeData = JSON.parse(JSON.stringify(data));
const flattenData = [];
function flattenTree(data, parentKey) {
data.forEach(ele => {
const { title, key, children } = ele;
flattenData.push({ title, key, parentKey });
if (children){
flattenTree(children, key);
}
})
}
flattenTree(treeData, null);
return flattenData;
}
const result = flattenTreeDataClosure(treeData);
console.log(result);
// 3.给个节点0-0-1-0,找到ta所有的父级节点
function findParent(item, flattenTree){
const parentArr = []; // 存储所有的父级元素
function find(item, flattenTree) {
flattenTree.forEach(ele => {
if (ele.key === item){
parentArr.unshift(ele.key);
find(ele.parentKey, flattenTree);
}
})
}
find(item, flattenTree);
return parentArr;
}
console.log(findParent('0-0-0-0-0', result));
js遍历树结构,查找某个节点的父级元素
于 2020-08-08 22:36:38 首次发布