2017-02-17 3 views
1

Ich weiß nicht, was ich falsch mache, aber dieser Code nach der ersten Ausführung ändert mein recipesData Objekt, und auf der zweiten Ausführung bekomme ich sehr große Variablen (weil Code Verwendung recipesData).Node.js ändert irgendwie mein Objekt mit rekursive Funktion

Wenn ich Debugger-Objekt (recipesData) zu ändern beginnt hier:

child[child_part] *= craft[part]; 

child ist noch eine weitere Variable nicht auf recipesData verwandt.

Dies ist der Code, den ich verwenden:

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; 
} 

Antwort

0

Objekte in JavaScript als Referenz übergeben werden, nicht Wert. Inside getBasics, craft ist ein Verweis auf die gleichen zugrunde liegenden Daten wie recipeData. child ist eine Referenz auf eines der inneren Objekte recipeData.

Wenn Sie also die *= verwenden, um einen neuen Wert für die Eigenschaften in child zuzuordnen, es arbeitet auf den gleichen Daten, die die recipeData Variablenreferenzen.

+0

Vielen Dank für Antwort verstehe ich die Grundidee, aber immer noch nicht wissen, wie man ohne Abhilfe ist es zu beheben wie echte Kopie machen ... –

0

Kind unten ist nur eine Referenz zu den recipesData.

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

und modifiziert daher später die reactsData. Wenn Sie eine echte Kopie des Arrays haben wollen, können Sie es z. mit slice() oder mit concat() wie:

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