2016-05-05 2 views
0

У меня есть следующий код.Элемент массива Javascript перезаписан

Код выполняет итерацию по коллекции объектов jsonRow, они помещаются в массив jsonRows, тогда объект jsonRow сбрасывается по свойству свойства.

Этот сброс вызывает повреждение объекта jsonRow в массиве jsonRows. Любые подсказки к этому поведению?

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 
Смежные вопросы