2025-10-20 18:16:13 +08:00

163 lines
3.2 KiB
TypeScript

interface Tree {
id: number
resourceUrl: string
type: string
fileName: string
defaultSort: number
children?: Tree[]
}
interface OriginDataItem {
id: number
resourceUrl: string
fileName: string
type: string
defaultSort: number
parentId?: number
}
export const originData: OriginDataItem[] = [
{
id: 12,
resourceUrl: 'bbb',
type: 'image',
fileName: '张三',
parentId: 10,
defaultSort: 2
},
{
id: 78,
resourceUrl: 'bbb',
type: 'image',
fileName: '张三',
parentId: 77,
defaultSort: 1
},
{
id: 80,
resourceUrl: 'bbb',
type: 'image',
fileName: '张三',
parentId: 78,
defaultSort: 4
},
{
id: 82,
resourceUrl: 'bbb',
type: 'image',
fileName: '张三',
parentId: 81,
defaultSort: 1
},
{
id: 84,
resourceUrl: 'bbb',
type: 'image',
fileName: '张三',
parentId: 83,
defaultSort: 1
},
{
id: 86,
resourceUrl: 'bbb',
type: 'image',
fileName: '张三',
parentId: 85,
defaultSort: 1
},
{
id: 88,
resourceUrl: 'bbb',
type: 'image',
fileName: '张三',
parentId: 87,
defaultSort: 1
},
{
id: 90,
resourceUrl: 'bbb',
type: 'image',
fileName: '张三',
parentId: 89,
defaultSort: 1
},
{
id: 92,
resourceUrl: 'bbb',
type: 'image',
fileName: '张三',
parentId: 91,
defaultSort: 1
},
{
id: 94,
resourceUrl: 'bbb',
type: 'image',
fileName: '张三',
parentId: 93,
defaultSort: 1
}
]
/**
* 将 originData 转换为 dataSource 的树形结构
* @param data 原始数据数组
* @returns 转换后的树形结构数据
*/
export function transformToTreeData(data: OriginDataItem[]): Tree[] {
// 创建映射表,用于快速查找
const itemMap = new Map<number, Tree>()
const result: Tree[] = []
// 首先创建所有节点
data.forEach((item) => {
itemMap.set(item.id, {
id: item.id,
resourceUrl: item.resourceUrl,
type: item.type,
fileName: item.fileName,
defaultSort: item.defaultSort,
children: []
})
})
// 构建树形结构
data.forEach((item) => {
const treeNode = itemMap.get(item.id)!
if (item.parentId) {
const parentNode = itemMap.get(item.parentId)
if (parentNode) {
parentNode.children!.push(treeNode)
} else {
// 如果找不到父节点,作为根节点处理
result.push(treeNode)
}
} else {
// 没有父节点,作为根节点
result.push(treeNode)
}
})
// 递归排序函数
function sortChildren(node: Tree) {
if (node.children && node.children.length > 0) {
// 重新排列 children
node.children = node.children.sort((a, b) => a.defaultSort - b.defaultSort)
// 递归处理子节点
node.children.forEach((child) => sortChildren(child))
}
}
// 重新排列根节点
const sortedResult = result.sort((a, b) => a.defaultSort - b.defaultSort)
// 递归排序所有子节点
sortedResult.forEach((node) => sortChildren(node))
return sortedResult
}
// 使用示例
export const transformedDataSource = ref(transformToTreeData(originData))