You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历对比asmTreeNode对象树,匹配UUID后复制属性?

问题分析与修复方案

原代码的核心问题

  • TypeScript语法错误:变量A和B的声明方式不符合规范,需使用const/let配合类型标注
  • 队列逻辑完全错误:错误用数组索引访问队列元素,嵌套循环逻辑未处理树的层级关系
  • 未实现层级遍历规则:仅处理根节点,未递归处理子节点,也没遵循“父节点不匹配则跳过子节点”的要求
  • 无效代码:e.children;和B[i].children;两行无实际操作
  • 匹配逻辑混乱:强行将A的每个根节点与B的所有根节点配对,未正确查找uuid匹配的节点

正确实现思路

  1. 层级优先匹配:从根节点开始,先匹配当前层级节点,仅当父节点uuid匹配时,才继续处理其子节点
  2. 递归遍历树结构:利用递归处理树的嵌套层级,契合树结构的天然特性
  3. 精准属性复制:找到uuid匹配的节点后,逐个复制B节点的属性到A节点(避免直接引用导致的副作用)
  4. 高效查找优化:用Map存储新节点的uuid映射,将查找时间从O(n)降到O(1),提升大节点量场景下的性能

修复后的代码实现

export class asmTreeNode {
    uuid: string; // 根据实际uuidv4类型调整,此处假设为string
    name: string;
    instanceName: string;
    guid: string;
    componentId: number;
    type: string;
    transform: any[] = [];
    data: any;
    children: asmTreeNode[] = []; // 初始化空数组避免undefined报错
}

class TreeUpdater {
    getExistingTree(): asmTreeNode[] {
        // 替换为你的现有树获取逻辑
        return [];
    }

    getNewTree(): asmTreeNode[] {
        // 替换为你的新树获取逻辑
        return [];
    }

    public compareAndCopyNodeProperties(): void {
        const existingTree: asmTreeNode[] = this.getExistingTree();
        const newTree: asmTreeNode[] = this.getNewTree();

        // 递归处理节点的核心函数
        const updateMatchingNodes = (existingNodes: asmTreeNode[], newNodes: asmTreeNode[]) => {
            // 预存新节点的uuid映射,提升查找效率
            const newNodeMap = new Map<string, asmTreeNode>(
                newNodes.map(node => [node.uuid, node])
            );

            existingNodes.forEach(existingNode => {
                const matchingNewNode = newNodeMap.get(existingNode.uuid);
                if (matchingNewNode) {
                    // 按需复制需要更新的属性
                    existingNode.name = matchingNewNode.name;
                    existingNode.instanceName = matchingNewNode.instanceName;
                    existingNode.guid = matchingNewNode.guid;
                    existingNode.componentId = matchingNewNode.componentId;
                    existingNode.type = matchingNewNode.type;
                    existingNode.transform = [...matchingNewNode.transform]; // 浅拷贝数组
                    existingNode.data = {...matchingNewNode.data}; // 浅拷贝data,复杂对象需深拷贝

                    // 父节点匹配,递归处理子节点
                    updateMatchingNodes(existingNode.children, matchingNewNode.children);
                }
                // 父节点不匹配,直接跳过子节点处理
            });
        };

        // 启动根节点层级的更新流程
        updateMatchingNodes(existingTree, newTree);
    }
}

额外说明

  • 深拷贝需求:如果transform或data是嵌套复杂对象,需使用深拷贝(比如JSON.parse(JSON.stringify(matchingNewNode.data))或lodash的cloneDeep),避免修改A节点时影响B节点
  • 类型适配:确保uuid的类型与实际定义一致,若uuidv4是自定义类型,需调整Map的键类型
  • 可扩展性:可将属性复制逻辑抽成单独函数,方便后续调整需要复制的属性列表

内容的提问来源于stack exchange,提问作者GeekAndNerd223

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:39:04