// TODO @芋艿:1)代码优化;2)是不是抽到公共的? /** * 构造树型结构数据 * @param {*} data 数据源 * @param {*} id id字段 默认 'id' * @param {*} parentId 父节点字段 默认 'parentId' * @param {*} children 孩子节点字段 默认 'children' */ export const handleTree = (data: any[], id?: string, parentId?: string, children?: string) => { if (!Array.isArray(data)) { console.warn('data must be an array') return [] } const config = { id: id || 'id', parentId: parentId || 'parentId', childrenList: children || 'children' } const childrenListMap = {} const nodeIds = {} const tree: any[] = [] for (const d of data) { const parentId = d[config.parentId] if (childrenListMap[parentId] == null) { childrenListMap[parentId] = [] } nodeIds[d[config.id]] = d childrenListMap[parentId].push(d) } for (const d of data) { const parentId = d[config.parentId] if (nodeIds[parentId] == null) { tree.push(d) } } for (const t of tree) { adaptToChildrenList(t) } function adaptToChildrenList(o) { if (childrenListMap[o[config.id]] !== null) { o[config.childrenList] = childrenListMap[o[config.id]] } if (o[config.childrenList]) { for (const c of o[config.childrenList]) { adaptToChildrenList(c) } } } return tree }