Объект меняется, даже если я не делаю с ним никаких операций - PullRequest
0 голосов
/ 25 октября 2019

Может кто-нибудь сказать мне, почему в следующем фрагменте кода значение ColumnNames изменяется в позиции отладчика? Он принимает то же значение, что и tempColumns после tempColumns[k] = modi[i].data[k];.

var addRecords= []; 
var columns = ["Column1","Column2","Column4","Column5"]
var columnNames = {};
var modi = [{
 data: {
  Column1: 'bla'
 }
},{
 data:{
  Column2: 'test'
 }
}];
var tempColumns = {};

for( var n in columns){
 var column = columns[n];
 columnNames[column] = "";
}

for(var i in modi){
 tempColumns = columnNames;
 for(var k in modi[i].data){
  tempColumns[k] = modi[i].data[k];
  debugger;
 }
 addRecords.push(tempColumns);
}

Ответы [ 2 ]

4 голосов
/ 25 октября 2019

Это происходит потому, что вы присвоили columnNames для tempColumns перед вашим отладчиком. В javascript значения объектов передаются по ссылке, что означает, что после строки:

tempColumns = columnNames

tempColumns и columnNames указывают на одну и ту же позицию в памяти.

1 голос
/ 25 октября 2019

Вам необходимо сделать копию объекта. Когда вы говорите tempColumns = columnNames, тогда они оба указывают на одну и ту же память. следующим методом вы можете сделать копию объекта: JSON.parse(JSON.stringify(obj))

obj = {1:"hi", 2:"by"};


newobj = JSON.parse(JSON.stringify(obj));
newobj["1"] = "hello";

document.write("old: <br>");
for(var i in obj){
document.write(i+': '+obj[i] + ', ');
}

document.write('<br><br>');
document.write('new: <br>');
for(var j in newobj){
document.write(j+': '+newobj[j] + ', ');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...