При попытке изменить текущий элемент во время итерации по массиву сбой модификации. Ниже приведен пример кода.Модификация массива в то время как итерация
var s_arr = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}];
var arr = [];
for(var i in s_arr) {
if(s_arr[i].a == 5) {
s_arr[i].b = 0;
console.log('First modification: ' +JSON.stringify(s_arr[i]));
arr.push(s_arr[i]);
s_arr[i].b = 9;
console.log('Second modification: ' +JSON.stringify(s_arr[i]));
arr.push(s_arr[i]);
}
}
console.log('Final: ' +JSON.stringify(arr));
После запуска выше сценарий node test.js
, ниже результат.
First modification: {"a":5,"b":0}
Second modification: {"a":5,"b":9}
Final: [{"a":5,"b":9},{"a":5,"b":9}]
Ожидаемый результат:
First modification: {"a":5,"b":0}
Second modification: {"a":5,"b":9}
Final: [{"a":5,"b":0},{"a":5,"b":9}]
Однако при добавлении нового объекта во время итерации & присвоения каждому значения текущего элемента (объекта) интенсивно работает.
var s_arr = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}];
var arr = [];
for(var i in s_arr) {
if(s_arr[i].a == 5) {
s_arr[i].b = 9;
console.log('Second modification: ' +JSON.stringify(s_arr[i]));
arr.push(s_arr[i]);
var a = {};
a.a = s_arr[i].a;
a.b = 0;
arr.push(a);
var b = {};
b.a = s_arr[i].a;
b.b = 9;
arr.push(b);
}
}
console.log('Final: ' +JSON.stringify(arr));
Ниже приводится результат изменения сценария.
Final: [{"a":5,"b":0},{"a":5,"b":9}]
Почему первый скрипт при запуске показывает модификацию объекта справа, но окончательный массив показывает, что состоит из измененных объектов, не так, как ожидалось?
возможно, потому что это тот же объект? .. он не нажимает копию этого объекта в массиве, поэтому вы добавляете ту же ссылку на объект дважды. – Hacketo
Объекты, всегда передаваемые по ссылке, вы должны клонировать вручную –