我的树节点获取后大体长这样:
[
{"id": "1_1","text": "1级节点1","children": [...]},
{"id": "1_1_1","text": "2级节点1","children": [...]},
{"id": "1_1_2","text": "2级节点2"},
{"id": "2_1","text": "1级节点2","children": [...]},
{"id": "2_1_1","text": "2级节点2"}
...
]
就是取数时,父节点与子节点全部拿到了。因为某种需求,我不需要所有勾选的节点数据,而是如果某个节点的子节点全部勾选,只要父节点就行。
先说思路吧:
1、遍历一遍数据arr:
(1)所有节点存储在键值对temp对象中(以id为键,以节点数据为值);
(2)有children字段的保留,没有children的从原数组中删除
2、遍历处理后的数据arr(此时的每一项都是有children的)
循环arr每一项的children列表,比如item为node,如果temp中有node的id,那么删除该键
3、最后遍历temp中剩余的键值对,就是最后要获取的顶级父节点数据
下面是代码:
// 存放节点数据的键值对
const temp = {};
// 遍历arr,生成键值对及过滤非末级节点
for (let i = 0; i < arr.length; i++) {
const node = arr[i];
temp[node.id] = node;
if (!node.children) {
arr.splice(i, 1);
i--;
}
}
// 遍历过滤后的arr,把有每一个节点的children节点都从键值对中删除
for (let j=0; j<arr.length; j++) {
const children = arr[i].children;
for (let k=0; k< children.length; k++) {
if(temp.hasOwnProperty(children[k]["id"])) {
delete temp[childNodes[k]["id"]];
}
}
}
// 最后留下的,就是要的顶级节点数据
let result = Object.keys(temp);