2016-04-30 10 views
1

Ich versuche, durch einen rekursiven JSON-Baum wie folgt (json2) durchlaufen und mit einem anderen JSON (JSON) zusammenführen, wenn der Bezeichner wie folgt übereinstimmt. Beachten Sie, dass immer Objekte verfügbar ist, möglicherweise Objekte oder Objekt aber jede wie der Bezeichner in der gleichen Hierarchie des Objekts sein wird.Traverse rekursive JSON-Struktur und Merge

Hinweis: Kennungswert ist immer eindeutig

I Durchlauf die Underscore.js Bibliothek haben, kann aber nicht jeder der Funktion finden, die diese Anforderung passen. Im normalen Listenfall würde findWhere ausreichen, um zu lösen, aber dies ist nicht der Fall, da es mehrere Ebenenhierarchie hat.

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 
     }, 
    ] 
} 

Nach der Zusammenführung

{ 
    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 
     }, 
    ] 
} 

Antwort

1

Mindestens Sie einige Iteration benötigen und eine rekursive Art für immer die richtige innere Objekt für Festlegen der neuen Eigenschaft

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