判断回显的父节点下的叶子节点是否全部选中,全部选中就是全选,保留;没有全选就是半选,不保留。保留与不保留说的是回显的数组数据。
// 处理tree关联全选半选
export function processTreeData(treeData, selectedIds) {
const fullySelected = []; // 叶子节点全部被选中的父节点
const partiallySelected = []; // 叶子节点部分被选中的父节点
/**
* 递归遍历树节点
* @param {Object} node - 当前节点
* @returns {boolean} - 返回当前节点的叶子节点是否全部被选中
*/
function traverse(node) {
if (!node.children || node.children.length === 0) {
// 叶子节点:直接判断是否被选中
const isHas = selectedIds.map(q => String(q)).includes(node.id);
if (isHas) fullySelected.push(node.id)
return isHas
}
// 父节点:递归检查子节点
let allChildrenSelected = true;
let someChildrenSelected = false;
for (const child of node.children) {
const childSelected = traverse(child);
if (childSelected) someChildrenSelected = true;
if (!childSelected) allChildrenSelected = false;
}
// 分类父节点
if (allChildrenSelected) {
fullySelected.push(node.id);
} else if (someChildrenSelected) {
partiallySelected.push(node.id);
}
return allChildrenSelected;
}
// 遍历树数据
for (const node of treeData) {
traverse(node);
}
return {
fullySelected,
partiallySelected,
};
}