2016-10-24 21 views
1

私は再帰関数で重大な問題に直面しています。これは私の再帰関数である:forループ関数for recursive function

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; 

}, 

は、今の問題は、私のjsonDataを変えつつある

(jsonData.children.length)、2番目のforループでは、ということです。親jsonDataを保持する方法。

私の質問は明らかです。 より正確に編集する。 最初にjsondataに5つの要素があり、ループに入り、最初の子を新しいjsonDataとして取り込み、この関数を再度呼び出します。条件が満たされると、それはforループに戻り、jsonDataは5データの初期要素を持つ必要があります。オリジナルのjsonDataの最初の子要素である新しいjsonデータを持っています。

私の質問は、5要素でその親jsonDataを保持する方法です。私は、入力されたデータについては知らないが、

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

これはjsonDataを上書きすることができますラインのみであるため

+0

オブジェクトは参照によって渡されるため、 'jsonData = jsonData.children [i];が発行されます。 '' jsonData.children [i] = returnedSelf.iterateJson(data、jsonData、returnedSelf); ' – Rajesh

+0

の値を取得する関数の外にgloba変数を宣言することができます。 –

+0

' children'は、自動的に長さが更新されます。だから、もしあなたが 'i'と比較されている間、すべての反復で同じ長さに依存する再帰的ループを使用するなら、長さは配列にもっと押し込むにつれて増加するかもしれません。これが起こっている場合、forEachやmapのような配列メソッドを使いたいかもしれません。私はまだ真剣に見ていない... – zer00ne

答えて

0