2015-05-17 6 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: [] 
      } 
     ] 
    } 
]; 

मेरे सभी सरणी पेड़ हैं, एक नोड केवल एक माता-पिता से संबंधित हो सकता है। मैं सूची 1 के साथ सूची 1 को मर्ज करना चाहता हूं और परिणाम प्राप्त कर सकता हूं। मैंने कई तरीकों की कोशिश की, रिकर्सिव कॉलबैक, स्ट्रिंग सर्च & प्रतिस्थापित करें और इसी तरह, लेकिन मैं अभी भी इसे समझ नहीं पाया।आयामी सरणी कैसे विलय करें

उत्तर

0

निम्नलिखित कोड दो पेड़ सरणियों ही नहीं, सबसे ऊपरी स्तर पर के सभी स्तरों में मर्ज हो जाएगी:

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>'); 

कोड देखें JSBin पर रहते हैं: http://jsbin.com/wikaricita/3/edit?js,output

नोट यह इस एल्गोरिथ्म है कि ओ (एन^2) की जटिलता, जिसका अर्थ है कि यह वास्तव में अच्छी तरह से स्केल नहीं करेगा। यदि पेड़ बहुत बड़ा हो या प्रदर्शन एक महत्वपूर्ण मुद्दा है, तो आप शायद इस समस्या को हल करने के अन्य तरीकों को देखना चाहते हैं।

+0

सूची 3 अपेक्षित परिणाम है। – Aflext

+0

क्या आपके सरणी पेड़ हैं? या क्या एक तत्व में कई माता-पिता हो सकते हैं? यदि यह एक पेड़ माना जाता है, तो आप दो सरणीओं के बीच विवादित परिभाषाओं को कैसे संभालना चाहते हैं जिन्हें आप विलय करना चाहते हैं? – Timo

+0

हां, दो सरणी पेड़ हैं। मैं जो करना चाहता हूं वह सर्वर से एक नया पेड़ सरणी को डीओएम मेमोरी में मौजूदा पेड़ सरणी में मिलाएं जैसे कि 'प्रदर्शित पेड़ को अपडेट करें'। – Aflext

2

यदि मैं आपको सही ढंग से समझता हूं, तो आप इसे आईडी द्वारा कॉम्पैक्ट करना चाहते हैं।

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; 
} 

सरणी समारोह में var arr = [list1, list2]; तरह लग रहा है बनाने के एक सरणी और एक वस्तु। ऑब्जेक्ट एक आईडी और एक सरणी हो जाता है। आईडी हमेशा एक ही है, इसलिए हम इसे पहले सरणी से लेते हैं। सरणी के माध्यम से जाओ और सभी वस्तुओं arr[i][0].children[0] धक्का। लूप के बाद सरणी में obj धक्का। परिणाम सरणी वापस करें।

Demo

+0

हालांकि, यह पूरे पेड़ को बार-बार मर्ज नहीं करता है। यह केवल पहले स्तर पर विलीन हो जाता है, इसके बाद सबकुछ सिर्फ कॉपी हो जाता है। – Timo

संबंधित मुद्दे