2017-02-17 11 views
1

と私のオブジェクトを変更し、私は私が間違っているのかわかりませんが、最初の実行後にこのコードはrecipesDataオブジェクトを変更し、第二の実行に私は非常に大きな変数を取得(理由コード使用recipesData )。のNode.jsは何とか再帰関数

私はデバッガオブジェクト(recipesData)を使用している場合は、ここで変化を開始:

child[child_part] *= craft[part]; 

childrecipesDataに関連していなくても別の変数です。

これは私が使用するコードです:JavaScriptで

first ex. second execute. 
282  11340 
336  69498 
390  108918 
82  3400 
82  3397 
27  745 
270  10629090 
27  19683 

// Some object with date 
var recipesData = { 
    'test1': { 
     'example1': 544, 
     'example2': 323 
    }, 
    'test2': { 
     'example1': 123 
    }, 
} 

// Function that I call from main file 
module.exports.getFinished = function (item, stock) { 
    // Create temp 'recipes' variable 
    var recipes = recipesData[item]; 
    // Execute recursive func 
    var basics = getBasics(recipes); 

    return basics; 
}; 

// Create 'finished' empty object 
var finished = {}; 

// My recursive fuction that works pretty nice at first 
function getBasics(craft) { 
    for (var part in craft) { 
     for (var recipe in recipesData) { 
      if (recipesData.hasOwnProperty(part)) { 
       var child = recipesData[part]; 
       break; 
      } else 
       child = null; 
     } 

     if (child) { 
      for (var child_part in child) 
       // HERE it's CHANGE my 'recipesData' object at the top! 
       child[child_part] *= craft[part]; 
      getBasics(child); 
     } else { 
      if (finished.hasOwnProperty(part)) 
       finished[part] += craft[part]; 
      else 
       finished[part] = craft[part]; 
     } 
    } 
    return finished; 
} 

答えて

0

オブジェクトは参照ではなく値によって渡されます。 getBasicsの内部では、craftは、recipeDataと同じ基本データへの参照です。 childrecipeDataの内部オブジェクトのいずれかへの参照です。

を使用して、childのプロパティに新しい値を割り当てると、recipeDataという変数が参照するのと同じデータで動作しています。

+0

回答ありがとうございます、私は主なアイデアを理解していますが、それを修正する方法はまだ分かりません。 –

0

以下の子供はrecipesDataを参照しているだけです。

if (recipesData.hasOwnProperty(part)) { 
      var child = recipesData[part]; 
      break; 
     } else 
      child = null; 
    } 

実際のレシピデータで後で変更されます。アレイの実際のコピーを作成したい場合は、それを行うことができます。スライス()またはconcat()のように:

child = [].concat(recipesData[part]);