2016-10-24 2 views
1

Ich stehe vor kritischem Problem in der rekursiven Funktion. Dies ist meine rekursive Funktion:für Schleife in rekursiver Funktion

iterateJson(data, jsonData, returnedSelf) { 
    var obj = { 
    "name": data.groupName, 
    "size": 4350, 
    "type": data.groupType 
    }; 

    if (data.parentGroupName == jsonData.name) { 
    jsonData.children.push(obj); 
    } else { 
    if (jsonData.children) { 
     for (var i = 0; i < jsonData.children.length; i++) { 
     if (data.parentGroupName == jsonData.children[i].name) { 
      jsonData.children[i].children.push(obj); 
      elementFound = true; 
      break; 
     } 
     } 
     if (elementFound) { 
     return jsonData; 
     } else { 
     if (jsonData.children) { 
      for (i = 0; i < jsonData.children.length; i++) { 
      if (elementFound) { 
       return jsonData; 
      } else { 
       jsonData = jsonData.children[i]; 
       jsonData = returnedSelf.iterateJson(data, jsonData, returnedSelf); 
      } 
      } 
     } 
     } 
    } 

    } 

    return jsonData; 

}, 

Das Problem ist jetzt, dass in der zweiten for-Schleife (jsonData.children.length)

meine jsonData geändert zu werden. wie man die Eltern jsonData behält.

Hope meine Frage ist klar. Bearbeiten, um es genauer zu machen. nehme an, anfänglich jsondata hat 5 Elemente und ich gehe in die Schleife nahm erste Kinder als neue jsonData und rufen Sie diese Funktion erneut. Wenn die Bedingung also erfüllt wird, sollte sie zur for-Schleife zurückkehren und jsonData sollte dieses anfängliche Element mit 5 Daten enthalten. Statt dessen hat es neue json-Daten, die das erste untergeordnete Element der ursprünglichen jsonData sind.

Meine Frage ist, wie diese Eltern jsonData mit 5 Element zu behalten.

+0

Objekte werden als Referenz übergeben, so dass 'jsonData = jsonData.children [i];' das Problem verursacht. try 'jsonData.children [i] = returnedSelf.iterateJson (Daten, jsonData, returnedSelf);' – Rajesh

+0

Sie können eine globale Variable außerhalb Ihrer Funktion deklarieren, die den Wert jsonData.children.length erhält –

+0

'children' ist eine Live-Sammlung, die das bedeutet es aktualisiert seine Länge automatisch. Wenn Sie also eine rekursive Schleife verwenden, die darauf beruht, dass die Länge bei jeder Iteration gleich bleibt, während sie mit "i" verglichen wird, kann die Länge zunehmen, wenn Sie mehr in das Array hineinschieben. Wenn dies der Fall ist, sollten Sie Array-Methoden wie forEach oder map verwenden. Ich habe noch nicht so ernsthaft geschaut ... – zer00ne

Antwort

0

Da ich nicht über Eingangsdaten wissen Sie aber

jsonData = jsonData.children[i]; 
jsonData = returnedSelf.iterateJson(data, jsonData,  returnedSelf); 

Dies sind nur Linien, die jsonData außer Kraft setzen können.

Verwandte Themen