【问题标题】:merging two trees using treemodel.js使用 treemodel.js 合并两棵树
【发布时间】:2014-12-06 03:35:52
【问题描述】:

示例: http://jsfiddle.net/yeehawjared/bawv0790/

我正在构建一个打开网页的应用程序,加载大型数据树结构的 JSON。 TreeModel.js 解析得很好,一切都很好。

随着时间的推移,浏览器会以较小的数据树的形式接收更新。我正在尝试将additionalDatamasterTree 结合起来。我想不出一种同时走两个节点并进行逐节点比较的方法。如果可以的话,聚合node.model.x 属性并添加子元素(如果它们不存在)会很容易。

在下面的代码中,我浏览了附加数据 - 但我不知道如何有效地将新节点组合到 masterTree。有人可以用伪代码帮助我的方法或为我指明正确的方向吗?不断更新我的masterTree 的最佳方式是什么?

非常感谢。

var tree = new TreeModel();
var masterTree = tree.parse(data1);

var additionalData = tree.parse(data2);
additionalData.walk(function (node) {

    // compare additionalData to the masterTree
    if (node.model.id == masterTree.model.id) {
        console.debug('match, combine the attributes')
    } else {
        // add the additional node to the materTree
    }
});

【问题讨论】:

    标签: javascript performance tree treemodel


    【解决方案1】:

    看看这个小提琴的例子:http://jsfiddle.net/bawv0790/1/

    重要的功能是mergeNodes。它是一个递归函数,接收 2 个节点 n1 和 n2。首先,它根据 n2 更新 n1 的大小,如果它们缺失,它们会将 n2 个子元素添加到 n1,如果它们存在,则将它们合并。

    function mergeNodes(n1, n2) {
        var n1HasN2Child, i, n2Child;
    
        // Update the sizes
        updateSize(n1, n2);
    
        // Check which n2 children are present in n1
        n1HasN2Child = n2.children.map(hasChild(n1));
    
        // Iterate over n2 children
        for (i = 0; i < n1HasN2Child.length; i++) {
            n2Child = n2.children[i];
            if (n1HasN2Child[i]) {
                // n1 already has this n2 child, so lets merge them
                n1Child = n1.first({strategy: 'breadth'}, idEq(n2Child));
                mergeNodes(n1Child, n2Child);
            } else {
                // n1 does not have this n2 child, so add it
                n1.addChild(n2Child);
            }
        }
    }
    

    如果对孩子进行排序,检查 n1 中有哪些 n2 个孩子可以大大改进。

    【讨论】:

    • 非常感谢您抽出宝贵时间帮助我。一旦我把事情整理好,我会消化这个并将其标记为正确答案。你摇滚!
    猜你喜欢
    • 2016-07-04
    • 2021-10-30
    • 1970-01-01
    • 2021-09-08
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    相关资源
    最近更新 更多