2016-04-30 3 views
1

Я пытаюсь пройти через рекурсивное дерево json, как следует (json2), и слиться с другим json (json), если идентификатор соответствует следующему. Обратите внимание, что всякий раз, когда есть объекты, он может иметь объектов или объект, но любой способ идентификации идентификатора в той же иерархии объекта.Трассировка рекурсивного дерева json и слияния

Примечание: Значение идентификатора всегда является уникальным

У меня есть прохождение игры в underscore.js библиотеку, но не могу найти какой-либо функции, которые соответствуют этому требованию. В обычном случае, findWhere будет достаточно, чтобы решить, но это не так, поскольку он имеет иерархию уровней.

JSON 2:

{ 
    "identifier1": "123456", 
    "identifier2": "234567" 
} 

JSON 1:

{ 
    subtopic: [ 
     { 
      "title": "title 1", 
      "subtitle": "title 2", 
      "objects": [{ 
       "title": "123" 
       "label": "456" 
       "objects": [ 
        { 
         "identifier": "identifier1", 
         "object": { 
          "object-1": "123", 
          "object-2": "456" 
         } 
        }, 
        { 
         "identifier": "identifier2", 
         "object": { 
          "object-1": "123", 
          "object-2": "456" 
         } 
        } 
       ] 
      }] 
     }, 
     { 
      ... 
      ... 
      Similar as above 
     }, 
    ] 
} 

После слияния

{ 
    subtopic: [ 
     { 
      "title": "title 1", 
      "subtitle": "title 2", 
      "objects": [{ 
       "title": "123" 
       "label": "456" 
       "objects": [ 
        { 
         "result": "123456", 
         "identifier": "identifier1", 
         "object": { 
          "object-1": "123", 
          "object-2": "456" 
         } 
        }, 
        { 
         "result": "234567" 
         "identifier": "identifier2", 
         "object": { 
          "object-1": "123", 
          "object-2": "456" 
         } 
        } 
       ] 
      }] 
     }, 
     { 
      ... 
      ... 
      Similar as above 
     }, 
    ] 
} 

ответ

1

По крайней мере, вам потребуются некоторые итерации и рекурсивный стиль для получения правильного внутреннего объекта для устанавливая новое свойство.

function merge(array, object) { 
 
    Object.keys(object).forEach(function (k) { 
 
     function iter(a) { 
 
      if (a.identifier === k) { 
 
       r = a; 
 
       return true; 
 
      } 
 
      return Array.isArray(a.objects) && a.objects.some(iter); 
 
     } 
 

 
     var r; 
 
     array.some(iter);        
 
     if (r) { 
 
      r.result = object[k]; 
 
     } 
 
    }); 
 
} 
 

 
var object2 = { "identifier1": "123456", "identifier2": "234567" }, 
 
    object1 = { subtopic: [{ "title": "title 1", "subtitle": "title 2", "objects": [{ "title": "123", "label": "456", "objects": [{ "identifier": "identifier1", "object": { "object-1": "123", "object-2": "456" } }, { "identifier": "identifier2", "object": { "object-1": "123", "object-2": "456" } }] }] }] }; 
 

 
merge(object1.subtopic, object2); 
 
document.write('<pre>' + JSON.stringify(object1, 0, 4) + '</pre>');

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