1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| type Key = string;
type TreeData = Array<{ key: Key; children?: TreeData; }>;
type CheckedKeys = Array<Key>;
interface Node { key: Key, parent: string | null } function handleUnCheck( treeData: TreeData, preCheckedKeys: CheckedKeys, key: Key, ): CheckedKeys { type TreeObj = TreeData[0] const allNodes: Array<Node> = [] const removeNodes = new Set([key])
treeData.forEach(treeDataItem => { let count = 0 getTreeNodeParent(treeDataItem, count) }) getRemoveTreeNodeList(allNodes, key)
const res: CheckedKeys = preCheckedKeys.filter(item => { return !removeNodes.has(item) }) return res function getRemoveTreeNodeList(allNodes, removeKey: Key) { allNodes.forEach(item => { if (item.parent === removeKey) { removeNodes.add(item.key) const res = isParent(allNodes, item.key) if (res && !removeNodes.has(res as string)) { getRemoveTreeNodeList(allNodes, item.key) } } }) } function isParent(arr: Array<Node>, itemKey: Key): boolean | string { for (let i = 0; i < arr.length; i++) { if (arr[i].parent === itemKey) { return arr[i].key } } return false } function getTreeNodeParent(parent: TreeObj, count: number): void { if (count === 0) { allNodes.push({ key: parent.key, parent: null } as Node) } count++ parent.children && parent.children.forEach(item => { allNodes.push({ key: item.key, parent: parent.key } as Node) if (item.children) { getTreeNodeParent(item, count++) } }) } }
const TREE_DATA = [{ key: 'a-1', children: [ { key: 'b-1', children: [ { key: 'c-1-1' }, { key: 'c-1-2' } ] }, { key: 'b-2' }, { key: 'b-3' } ] }, { key: 'a-2' }];
console.log(handleUnCheck(TREE_DATA, ['a-1', 'b-1', 'b-2', 'c-1-1'], 'c-1-1')); console.log(handleUnCheck(TREE_DATA, ['a-1', 'b-1', 'c-1-1', 'a-2'], 'a-1'));
|