2016-05-05 71 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