2014-10-10 2 views
3

пример: http://jsfiddle.net/yeehawjared/bawv0790/объединения двух деревьев с использованием treemodel.js

Я строю приложение, где открывает веб-страницу, загружая JSON большой древовидной структуры данных. TreeModel.js анализирует это замечательно, и все хорошо.

Со временем браузер получает обновления в виде небольших деревьев данных. Я пытаюсь обвести голову вокруг объединения additionalData в masterTree. Я не могу придумать способ одновременного перемещения обоих и провести сравнение узлов за узлом. Если бы я мог, было бы легко объединить node.model.x свойства и добавить детей, если они не существуют.

В приведенном ниже коде я просматриваю дополнительные данные, но я не знаю, как эффективно комбинировать новые узлы с masterTree. Может кто-то помочь моей методологии с psuedo-кодом или указать мне в правильном направлении? Каков наилучший способ постоянно обновлять мой 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 
    } 
}); 

ответ

3

Взгляните на эту скрипку для примера в действии: http://jsfiddle.net/bawv0790/1/

Важной функцией является mergeNodes. Это рекурсивная функция, которая получает 2 узла, n1 и n2. Сначала он обновляет размер n1 в соответствии с n2, и они добавляют 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); 
     } 
    } 
} 

Проверка того, какие дети n2 находятся в n1, может быть значительно улучшена, если дети были отсортированы.

+0

много, спасибо за то, что нашли время, чтобы помочь мне. Я собираюсь переварить это и пометить это как правильный ответ, как только у меня все выяснится. ты жжешь! – Jared

 Смежные вопросы

  • Нет связанных вопросов^_^