2013-04-17 14 views
6

I Winkel JS verwenden und eines ihrer Beispiele: http://jsfiddle.net/furf/EJGHX/rekursive Iteration über dynamisch verschachteltes Objekt Array

Ich brauche die Daten zu übernehmen, wenn die Update-Funktion einige Werte kommt es und fügen Sie, bevor ich an den Server senden. (Wenn dies mit eckigen statt js tun wäre besser lassen Sie mich wissen)

Ich versuche, die 'Eltern-ID' und die 'Index' und aktualisieren Sie die Kinder.

Hier die Daten ich Schleife durch

{ 
    "children": [{ 
     "id": "5", 
     "parentid": "0", 
     "text": "Device Guides", 
     "index": "1", 
     "children": [{ 
      "id": "10", 
      "index": "0", 
      "text": "Grandstream GXP-21XX" 
     }, { 
      "id": "11", 
      "index": "1", 
      "text": "Polycom Soundstation/Soundpoint" 
     }, { 
      "id": "23", 
      "index": "2", 
      "text": "New Polycom" 
     }] 
    }, { 
     "id": "6", 
     "parentid": "0", 
     "text": "Pre-Sales Evaluation", 
     "index": "0", 
     "children": [] 
    }, { 
     "id": "7", 
     "parentid": "0", 
     "text": "Router Setup Guides", 
     "index": "2", 
     "children": [{ 
      "id": "9", 
      "index": "0", 
      "text": "Sonicwall" 
     }, { 
      "id": "12", 
      "index": "1", 
      "text": "Cisco" 
     }] 
    }, { 
     "id": "9", 
     "parentid": "7", 
     "text": "Sonicwall", 
     "index": "0", 
     "children": [] 
    }, { 
     "id": "10", 
     "parentid": "5", 
     "text": "Grandstream GXP-21XX", 
     "index": "0", 
     "children": [] 
    }, { 
     "id": "11", 
     "parentid": "5", 
     "text": "Polycom Soundstation/Soundpoint", 
     "index": "1", 
     "children": [] 
    }, { 
     "id": "12", 
     "parentid": "7", 
     "text": "Cisco", 
     "index": "1", 
     "children": [] 
    }, { 
     "id": "15", 
     "parentid": "0", 
     "text": "Post-Sales Implementation Check List", 
     "index": "7", 
     "children": [{ 
      "id": "16", 
      "index": "0", 
      "text": "Porting and New Number Details" 
     }, { 
      "id": "18", 
      "index": "1", 
      "text": "Partner Setup" 
     }, { 
      "id": "19", 
      "index": "2", 
      "text": "test" 
     }, { 
      "id": "21", 
      "index": "3", 
      "text": "test" 
     }] 
    }, { 
     "id": "16", 
     "parentid": "15", 
     "text": "Porting and New Number Details", 
     "index": "0", 
     "children": [] 
    }, { 
     "id": "18", 
     "parentid": "15", 
     "text": "Partner Setup", 
     "index": "1", 
     "children": [] 
    }, { 
     "id": "19", 
     "parentid": "15", 
     "text": "test", 
     "index": "2", 
     "children": [] 
    }, { 
     "id": "20", 
     "parentid": "0", 
     "text": "test", 
     "index": "11", 
     "children": [] 
    }, { 
     "id": "21", 
     "parentid": "15", 
     "text": "test", 
     "index": "3", 
     "children": [] 
    }, { 
     "id": "23", 
     "parentid": "5", 
     "text": "New Polycom", 
     "index": "2", 
     "children": [] 
    }, { 
     "id": "24", 
     "parentid": "0", 
     "text": "Test Markup", 
     "index": "14", 
     "children": [] 
    }, { 
     "id": "25", 
     "parentid": "0", 
     "text": "test", 
     "index": "15", 
     "children": [] 
    }] 
} 

Dies ist, wie ich zur Zeit durch Looping bin, aber es wird nur die erste Dimension

for (i = 0, l = data.length; i < l; i++) { 
    parentid = data[i].id == null ? '0' : data[i].id; 
    data[i].index = i; 
    if (data[i].children) { 
     if (data[i].children.length > 0) { 
      for (q = 0, r = data[i].children.length; q < r; q++) { 
       data[i].children[q].parentid = parentid; 
       data[i].children[q].index = q; 
      } 
     } 
    } 
} 

Ich fand diese auf einer anderen Geige, aber ich weiß nicht, wie ich die Parentid oder greifen würde der Index

Antwort

5

Wenn ich Sie richtig bin zu verstehen, wollen Sie jedes ‚Kind‘ ein parentID (von der Mutter definiert; 0 sonst) haben und eine index (auf seine Position anhand innerhalb sie Satz Geschwister).

function normalize(parent) { 
    if (parent && parent.children) { 
     for (var i = 0, l = parent.children.length; i < l; ++i) { 
      var child = parent.children[i]; 
      child.index = i; 
      if (!child.parentId) child.parentId = parent.id || '0'; 
      normalize(child); 
     } 
    } 
} 

normalize(data); 
+0

Sieht so aus, als müsste es funktionieren. Ich habe es getestet und ich kann nicht scheinen, die Eltern-ID zu setzen. Hier ist, wie es integriert ist: http://jsfiddle.net/EJGHX/38/ Zeile 213, wenn Sie ein neues Kind-Element hinzufügen und verschieben, sehen Sie das Ergebnis in der Konsole. – Stephen

+0

@Stephen - Ich habe mir den Code in dem von Ihnen bereitgestellten Beispiel kurz angesehen, und es scheint nicht, dass einer der Knoten IDs zugeordnet sind. Wohin erwarten Sie, dass diese Informationen festgelegt werden? Im Moment wird jede 'child.parentId' auf '0'gesetzt, da' parent.id' nicht existiert. – Andrew

2

Rekursion ruft Funktion innerhalb der gleichen Funktion auf. Ihre Probe ist überhaupt keine Rekursion;

function runRecursive(input) { 
    for (var i = 0, l = input.length; i < l; i++) { 
     var current = input[i]; 

     parentid = current.id == null ? '0' : current.id; 
     current.index = i; 
     if (current.children && current.children.length > 0) { 
      runRecursive(current.children); 
     }; 
    }; 
}; 

runRecursive(data.children); 

Auch sollten Sie i und l mit var Schlüsselwort definieren, sonst wird es in Fenster Kontext und Rekursion Logik gebrochen befinden. Obwohl ich nicht bekomme, was ist parentid Variable für und warum es außerhalb sichtbaren Code definiert.

+0

Tommi, danke für Ihre Antwort. Wenn Sie auf Andrews Antwort schauen, ist seins näher an dem, wonach ich suche. Ich definiere die Eltern-ID aus der ID des Eltern-Objekts. – Stephen

+0

In der Tat. Vergessen Sie nicht, Andrew's Antwort für zukünftige Benutzer zu markieren. – Tommi

Verwandte Themen