Poniższy kod połączy wszystkie poziomy dwóch tablicach drzew, a nie tylko na górnej większości poziomie:
var list1 = ...
var list2 = ...
var addNode = function(nodeId, array) {
array.push({id: nodeId, children: []});
};
var placeNodeInTree = function(nodeId, parent, treeList) {
return treeList.some(function(currentNode){
// If currentNode has the same id as the node we want to insert, good! Required for root nodes.
if(currentNode.id === nodeId) {
return true;
}
// Is currentNode the parent of the node we want to insert?
if(currentNode.id === parent) {
// If the element does not exist as child of currentNode, create it
if(!currentNode.children.some(function(currentChild) {
return currentChild.id === nodeId;
})) addNode(nodeId, currentNode.children);
return true;
} else {
// Continue looking further down the tree
return placeNodeInTree(nodeId, parent, currentNode.children);
}
});
};
var mergeInto = function(tree, mergeTarget, parentId) {
parentId = parentId || undefined;
tree.forEach(function(node) {
// If parent has not been found, placeNodeInTree() returns false --> insert as root element
if(!placeNodeInTree(node.id, parentId, mergeTarget)){
list1.push({id: node.id, children:[]});
}
mergeInto(node.children, mergeTarget, node.id);
});
};
mergeInto(list2, list1);
document.write('<pre>');
document.write(JSON.stringify(list1, null, 4));
document.write('</pre>');
zobaczyć kod żyć JSBin: http://jsbin.com/wikaricita/3/edit?js,output
pamiętać, że ten algorytm złożoność O (n^2), co oznacza, że nie będzie się naprawdę dobrze skalować. Jeśli drzewa stają się bardzo duże, a wydajność to krytyczny problem, prawdopodobnie warto przyjrzeć się innym sposobom rozwiązania tego problemu.
the list3 jest oczekiwanym rezultatem. – Aflext
Czy twoje drzewa tablicowe? A może element ma wielu rodziców? Jeśli ma to być drzewo, jak chcesz obsługiwać sprzeczne definicje między dwoma tablicami, które chcesz scalić? – Timo
Tak, dwie tablice są drzewami. Chcę utworzyć nową tablicę drzewiastą z serwera do istniejącej tablicy drzew w pamięci DOM, np. "Zaktualizuj wyświetlane drzewo". – Aflext