2016-05-05 72 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。 如果您不希望將更改反映到您在數組中推送的對象中,則需要克隆這些對象。

例如:

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對象,則指向引用的所有內容都將具有新值。 您必須複製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