javascript-使用treemodel.js合并两棵树
作者:互联网
例:
http://jsfiddle.net/yeehawjared/bawv0790/
我正在构建一个打开网页的应用程序,加载大型数据树结构的JSON. TreeModel.js对此进行了很好的解析,一切都很好.
随着时间的流逝,浏览器会以较小的数据树的形式接收更新.我试图把头和后面的附加数据结合起来.我想不出一种方法,可以同时遍历两者并进行逐节点比较.如果可以的话,很容易聚合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
}
});
解决方法:
看看这个例子中的小提琴: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个孩子可以大大改善.
标签:performance,tree,treemodel,javascript 来源: https://codeday.me/bug/20191121/2049743.html