2016-03-29 13 views
4

ich eine einfache JSON haben, die die IDs der dependentant Objekte contasins ..anordnen JSON in Baumstruktur

var array1= 

    [ 
     { 
      "id": 84, 
      "outputTypeId": 900000000000002, 
      "previousOutputTypeActivitySeqMappingId": null, 
      "isRemoved": false, 
      "isPrimary": false 
     }, 
     { 
      "id": 95, 
      "outputTypeId": 900000000000002, 
      "previousOutputTypeActivitySeqMappingId": 84, 
      "isRemoved": false, 
      "isPrimary": false 
     }, 
     { 
      "id": 150, 
      "outputTypeId": 900000000000002, 
      "previousOutputTypeActivitySeqMappingId": 95, 
      "isRemoved": false, 
      "isPrimary": false 
     }, 
     { 
      "id": 160, 
      "outputTypeId": 900000000000002, 
      "previousOutputTypeActivitySeqMappingId": 95, 
      "isRemoved": false, 
      "isPrimary": false 
     } 
    ] 

ich durch die Identifizierung der „id“ und „previousOutputTypeActivitySeqMappingId“ und drückt auf das unten Format konvertieren wollte es in ein neues Array genannt Artikel

var array1= 

    [{ 
     "id": 84, 
     "outputTypeId": 900000000000002, 
     "previousOutputTypeActivitySeqMappingId": null, 
     "isRemoved": false, 
     "isPrimary": false, 
     "items": [ 
      { 
       "id": 95, 
       "outputTypeId": 900000000000002, 
       "previousOutputTypeActivitySeqMappingId": 84, 
       "isRemoved": false, 
       "isPrimary": false, 
       "items": [ 
        { 
         "id": 150, 
         "outputTypeId": 900000000000002, 
         "previousOutputTypeActivitySeqMappingId": 95, 
         "isRemoved": false, 
         "isPrimary": false, 
         "items": [] 
        }, 
        { 
         "id": 160, 
         "outputTypeId": 900000000000002, 
         "previousOutputTypeActivitySeqMappingId": 95, 
         "isRemoved": false, 
         "isPrimary": false, 
         "items": [] 
        } 
       ] 
      } 
     ] 
    }] 

der Code, den I ist unten angegeben versucht ... I ein Dummy-Objekt zuerst in dem neuen Format erstellt:

var dummyObj= { 
     "id": 84, 
     "outputTypeId": 900000000000002, 
     "previousOutputTypeActivitySeqMappingId": null, 
     "isRemoved": false, 
     "isPrimary": false 
    } 
function populateObj(array1, arrObj) { 
    for (var i = 0; i < array1.length; i++) { 
     if (array1[i].id == arrObj.parentActivityId) { 
      array1[i].items.push(arrObj); 
     } else { 
      populateObj(array1[i].items, arrObj); 
     } 
    } 
}; 

populateObj(dummyObj); 

Da ich am Anfang kein Dummy-Objekt fest codieren möchte. Gibt es eine Möglichkeit, diese Konvertierung mit Javascript zu erreichen?
Danke.

+0

Ich glaube, Sie sollten das nicht tun. Der erste JSON ist eine großartige Datenstruktur. Elemente bleiben über eine logische Zuordnungs-ID verbunden, die leicht durch Array.filter() offengelegt werden kann. – Davuz

Antwort

2
function group(arr) { 
    var t={}; 
    arr.forEach(function(obj) { 
     if (!obj.id) throw 'object found without id!'; 
     t[obj.id]=obj; 
    }); 
    var result=[]; 
    arr.forEach(function(obj) { 
     if (!obj.previousOutputTypeActivitySeqMappingId) { 
      result.push(obj); 
     } else { 
      var parent=t[obj.previousOutputTypeActivitySeqMappingId]; 
      if (!parent) throw('parent with id '+obj.previousOutputTypeActivitySeqMappingId+' not found!'); 
      var items=parent.items; 
      if (!items) { 
       items=[]; 
       parent.items=items; 
      } 
      items.push(obj); 
     } 
    }); 
    return result; 
} 
4

Dies kann sehr einfach mit ein paar Funktionen und ein wenig Rekursion getan werden.

Die erste Funktion nimmt die gesamte Quellenarray ein Quellobjekt und fügt die items Eigenschaft:

function createObject(sourceArray, obj) 
{ 
    obj.items = createArray(sourceArray, obj.id); 
    return obj; 
} 

Das wiederum eine andere Funktion verwendet die Quell-Array für die Kinder zu filtern:

function createArray(sourceArray, id){ 
    return sourceArray.filter(function(e){ 
           return e.previousOutputTypeActivitySeqMappingId == id; 
          }) 
          .map(function(e){ 
           return createObject(sourceArray,e); 
          }) 
} 

Sie werden feststellen, dass in tun, die an die createObject Funktion aufruft, um rekursiv fortzusetzen, den Baum zu erstellen.

Der letzte Teil ist es für die Einzelteile alle mit null Eltern, indem Sie treten Werte

var result = createArray(input,null); 

anschauliches Beispiel: https://jsfiddle.net/3epjb93j/