2016-05-05 12 views
0

Ich habe den folgenden Code.Javascript Array Element überschrieben

Der Code iteriert über eine Sammlung von jsonRow-Objekten, sie werden auf ein jsonRows-Array übertragen, und das jsonRow-Objekt wird Eigenschaft für Eigenschaft zurückgesetzt.

Dieser Reset bewirkt, dass das jsonRow-Objekt im Array jsonRows betroffen wird. Hinweise zu diesem Verhalten?

for(iterating over collection of jsonRow objects){ 
    if(0 < jsonRow.id.length && 0 < jsonRow.title.length){ 
     jsonRows.push(jsonRow); 

     console.log('jsonRow in jsonRows is intact', jsonRows); 

     for(var prop in jsonRow){ 
      jsonRow[prop] = '';      
     } 
     console.log('jsonRow properties in jsonRows are ""', jsonRows); 
    } 
} 

Antwort

1

Die Objekte in der jsonRows und diejenige, die Sie "Reset" sind gleich. Javascript übergibt parameters by references. Wenn Sie nicht möchten, dass die Änderung in den Objekten widergespiegelt wird, die Sie in das Array schieben, müssen Sie die Objekte klonen.

Zum Beispiel:

for(iterating over collection of jsonRow objects){ 
    if(0 < jsonRow.id.length && 0 < jsonRow.title.length){ 
    jsonRows.push(Object.assign({}, jsonRow)); 

    console.log('jsonRow in jsonRows is intact', jsonRows); 

    for(var prop in jsonRow){ 
     jsonRow[prop] = '';      
    } 
    console.log('jsonRow properties in jsonRows are ""', jsonRows); 
    } 
} 
1

Es ist, weil Sie einen Verweis des JSON-Objekt in dem Feld drücken. Wenn Sie nun das JSON-Objekt ändern, das auf die gleiche Referenz verweist, hat alles, was auf die Referenz verweist, den neuen Wert. Sie müssen das JSON-Objekt kopieren und dann auf das Array schieben, dann hat das Objekt eine neue Referenz.

0

Möchten Sie ein neues Objekt?

if(!Object.create){ 
    Object.create = function(obj){ 
    function F(){}; F.prototype = obj; 
    return new F; 
    } 
} 
var newObj = Object.create(oldObj); 
// now use your loop 
Verwandte Themen