Đoạn mã dưới đây sẽ hợp nhất tất cả các cấp của hai mảng cây, không chỉ trên hầu hết các cấp trên:
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>');
Xem mã sống trên JSBin: http://jsbin.com/wikaricita/3/edit?js,output
Lưu ý rằng nó thuật toán này có một sự phức tạp của O (n^2), có nghĩa là nó sẽ không thực sự tốt. Nếu cây có được rất lớn hoặc hiệu suất là một vấn đề quan trọng, bạn có thể muốn xem xét các cách khác để giải quyết vấn đề này.
danh sách3 là kết quả mong đợi. – Aflext
Có phải mảng cây của bạn không? Hoặc một yếu tố có thể có nhiều cha mẹ? Nếu nó được coi là một cây, làm thế nào để bạn muốn xử lý các định nghĩa xung đột giữa hai mảng mà bạn muốn hợp nhất? – Timo
Có, hai mảng là cây.Những gì tôi muốn làm là hợp nhất một mảng cây mới từ máy chủ với một mảng cây hiện có trong bộ nhớ DOM như 'cập nhật cây hiển thị'. – Aflext