2016-05-05 17 views
0

次のコードがあります。JavaScript配列の項目が上書きされました

コードはjsonRowオブジェクトのコレクションを反復し、jsonRows配列にプッシュされ、jsonRowオブジェクトはプロパティによってリセットされます。

このリセットにより、jsonRows配列のjsonRowオブジェクトが影響を受けます。 この現象の手掛かりはありますか?

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

答えて

1

jsonRowsのオブジェクトと「リセットする」オブジェクトは同じです。 Javascriptはparameters by referencesを渡します。 配列をプッシュするオブジェクトに変更を反映させたくない場合は、オブジェクトをクローンする必要があります。例えば

:あなたは配列にJSONオブジェクトの参照をプッシュするため

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

それはあります。同じ参照を指すJSONオブジェクトを変更すると、参照を指すすべてが新しい値になります。 JSONオブジェクトをコピーして配列にプッシュする必要があります。オブジェクトには新しい参照があります。

0

新しいオブジェクトが必要ですか?

if(!Object.create){ 
    Object.create = function(obj){ 
    function F(){}; F.prototype = obj; 
    return new F; 
    } 
} 
var newObj = Object.create(oldObj); 
// now use your loop 
関連する問題