zent
Version:
一套前端设计语言和基于React的实现
73 lines (63 loc) • 1.81 kB
text/typescript
import _union from '../../utils/union';
import { TreeRootIdArray, ITreeRootInfoMap } from './common';
/**
* 用于向上向下查找关联节点
*/
export default function correctMark(
markList: TreeRootIdArray = [],
rootInfoMap: ITreeRootInfoMap,
disabled: TreeRootIdArray = [],
isInit?: boolean
): TreeRootIdArray {
const nextMarkList: TreeRootIdArray = [];
const markMap: { [key: string]: boolean } = {};
// 向下查询
markList.forEach(rootId => {
if (!rootInfoMap[rootId]) {
return;
}
// 包含所有子孙
const rootIncludes = isInit
? rootInfoMap[rootId].rootIncludeIds
: rootInfoMap[rootId].rootIncludeIds.filter(id => {
return disabled.indexOf(id) === -1;
});
// 搜集所有相关的子孙节点
nextMarkList.push(...rootIncludes);
// 标记当前节点,用于向上查询
markMap[rootId] = true;
});
// 向上查询
markList.forEach(item => {
if (!rootInfoMap[item]) {
return;
}
let markParentId = rootInfoMap[item].parentId;
while (markParentId) {
// 父元素登记过, 则无需再向上查询
if (markMap[markParentId]) {
markParentId = undefined;
} else {
// 如果儿子被选中或则是禁用
if (
rootInfoMap[markParentId].son.every(
id => markMap[id] || disabled.indexOf(id) > -1
)
) {
// 标记该节点
markMap[markParentId] = true;
// 继续探索
markParentId = rootInfoMap[markParentId].parentId;
} else {
// 否则,止
markParentId = undefined;
}
}
}
});
// Object.keys.map for number id
return _union(
Object.keys(markMap).map(id => rootInfoMap[id].id),
nextMarkList
);
}