import type { NodeData } from '@/types/global'; // 寻找当前节点 export const findNode = (key: any, nodes: Array, keyName = 'key'): T => { if (!nodes || !nodes.length) { return undefined as unknown as T; } for (let node of nodes) { if (node[keyName] === key) { return node; } } // 寻找子级 for (let node of nodes) { if (node.children?.length) { const childrenNode = findNode(key, node.children, keyName); if (childrenNode) { return childrenNode as T; } } } return undefined as unknown as T; }; // 寻找父节点 export const findParentNode = (key: any, nodes: Array, keyName = 'key', parent = (undefined as unknown as T)): T => { if (!nodes || !nodes.length) { return undefined as unknown as T; } for (let node of nodes) { if (node[keyName] === key) { if (parent) { return parent; } else { // 根节点 return { root: true } as unknown as T; } } } // 寻找子级 for (let node of nodes) { if (node.children?.length) { const parentNode = findParentNode(key, node.children, keyName, node); if (parentNode) { return parentNode as T; } } } return undefined as unknown as T; }; // 级联寻找父节点 export const findParentNodes = (key: any, nodes: Array, result: Array, keyName = 'key', parent = ([] as T[])) => { if (!nodes || !nodes.length) { return; } for (let node of nodes) { if (node[keyName] === key) { result.push(...parent); return; } } // 寻找子级 for (let node of nodes) { if (node.children?.length) { const currentParent = [...parent, node]; findParentNodes(key, node.children, result, keyName, currentParent); } } }; // 检查是否包含子节点 单层 export const hasChildren = (key: string, nodes: Array, keyName = 'key'): boolean => { if (!nodes || !nodes.length) { return false; } return !!nodes.find(s => s[keyName] === key); }; // 获取所有节点 key export const flatNodeKeys = (nodes: Array, result: Array, keyName = 'key') => { if (!nodes || !nodes.length) { return; } for (let node of nodes) { result.push(node[keyName]); flatNodeKeys(node.children, result, keyName); } }; // 获取所有节点 export const flatNodes = (nodes: Array, result: Array) => { if (!nodes || !nodes.length) { return; } nodes.forEach(s => { result.push(s); flatNodes(s.children, result); }); }; // 移动节点 export const moveNode = (nodes: Array, dragNode: NodeData, dropNode: NodeData, dropPosition: number) => { // dropPosition === -1 将 dragNode 拖拽到 dropNode 上 // dropPosition === 0 将 dragNode 拖拽到 dropNode 中 // dropPosition === 1 将 dragNode 拖拽到 dropNode 下 const loop = (data: NodeData, key: number, callback: any) => { data.some((item: NodeData, index: any, arr: NodeData[]) => { if (item.key === key) { callback(item, index, arr); return true; } if (item.children) { return loop(item.children, key, callback); } return false; }); }; loop(nodes, dragNode.key as number, (_: NodeData, index: number, arr: NodeData[]) => { arr.splice(index, 1); }); if (dropPosition === 0) { loop(nodes, dropNode.key as number, (item: NodeData) => { item.children = item.children || []; item.children?.push(dragNode); }); } else { loop(nodes, dropNode.key as number, (_: NodeData, index: number, arr: NodeData[]) => { arr.splice(dropPosition < 0 ? index : index + 1, 0, dragNode); }); } };