使用treemodel.js合并两棵树

3

例子: 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
    }
});
1个回答

4
请看这个示例的fiddle演示:http://jsfiddle.net/bawv0790/1/ 重要的函数是mergeNodes。它是一个递归函数,接收两个节点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子节点存在,如果对子节点进行排序,则效果会大大提高。

非常感谢您抽出时间来帮助我。我会消化这些内容,并在整理好后将其标记为正确答案。你太棒了! - Jared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接