2015-05-17 12 views
6
var list1 = [ 
    { 
     id: 'node1', 
     children: [ 
      { 
       id: 'node11', 
       children: [] 
      } 
     ] 
    } 
]; 

var list2 = [ 
    { 
     id: 'node1', 
     children: [ 
      { 
       id: 'node13', 
       children: [] 
      } 
     ] 
    } 
]; 
var resultList = [ 
    { 
     id: 'node1', 
     children: [ 
      { 
       id: 'node11', 
       children: [] 
      }, { 
       id: 'node13', 
       children: [] 
      } 
     ] 
    } 
]; 

Tất cả các mảng của tôi là cây, một nút chỉ có thể thuộc về một phụ huynh. Tôi muốn hợp nhất list1 với list2 và nhận được resultList.I đã thử nhiều cách, gọi lại đệ quy, tìm kiếm chuỗi & thay thế và vân vân, nhưng tôi vẫn không thể hiểu được.cách hợp nhất các mảng chiều

Trả lời

0

Đ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.

+0

danh sách3 là kết quả mong đợi. – Aflext

+0

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

+0

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

2

Nếu tôi hiểu chính xác bạn, bạn muốn nó nhỏ gọn theo id.

function getCompactById(arr) { // must have the same id 
    var res = []; 
    var obj = {}; 
    obj.id = arr[0][0].id; 
    obj.children = []; 
    for(var i = 0; i < arr.length; i += 1) { 
     obj.children.push(arr[i][0].children[0]); 
    } 
    res.push(obj); 
    return res; 
} 

Mảng trông giống như var arr = [list1, list2]; Trong chức năng tạo một mảng và một đối tượng. Đối tượng nhận một id và một mảng. Id luôn giống nhau, vì vậy chúng tôi lấy nó từ mảng đầu tiên. Đi qua mảng và đẩy tất cả các đối tượng arr[i][0].children[0]. Sau khi vòng lặp đẩy obj trong mảng. Trả về mảng kết quả.

Demo

+0

Tuy nhiên, điều này không hợp nhất cây hoàn chỉnh một cách đệ quy. Nó chỉ hợp nhất ở cấp độ đầu tiên, mọi thứ sau đó chỉ được sao chép. – Timo

Các vấn đề liên quan