我有一个困惑,我无法理解为什么这段代码的结果(执行时)不正确。
我有2个对象数组(temparray1,temparray2)。基本上,我需要将temparray1的元素存储到temparray2,然后使用for循环更新值。
var temparray1 = [{title:"hi1",name:"name1",age:1},{title:"hi2",name:"name2",age:2},{title:"hi3",name:"name3",age:3}];
var temparray2 = [];
for(var aaa =0; aaa < temparray1.length; aaa++){
temparray2.push(temparray1[aaa]);
var len = temparray2.length - 1;
temparray2[len].color = "blue";
temparray2[len].gender = "girl";
temparray2.push(temparray1[aaa]);
len = temparray2.length - 1;
temparray2[len].color = "red";
temparray2[len].gender = "boy";
}
我期待的结果是:
temparray2 = [
{title:"hi1",name:"name1",age:1,color:"blue",gender:girl},
{title:"hi1",name:"name1",age:1,color:"red",gender:boy},
{title:"hi2",name:"name2",age:2,color:"blue",gender:girl},
{title:"hi2",name:"name2",age:2,color:"red",gender:boy},
{title:"hi3",name:"name3",age:3,color:"blue",gender:girl},
{title:"hi3",name:"name3",age:3,color:"red",gender:boy}
];`
但我得到的实际结果是temparray2中所有项目的颜色和性别变成了红色&#39;和男孩&#39;分别。此外,temparray1中当前项的值更新如temparray1 [0] = {title:&#34; hi1&#34;,name:&#34; name1&#34 ;, age:1,color:&#34;红色&#34;,性别:男孩}。但我不打算更新temparray1(第一个数组。)。
请让我知道你对此的看法。这让人非常困惑。提前谢谢!
答案 0 :(得分:0)
您需要对对象进行深层复制,否则如果对象被浅层复制,则更改一个对象的属性会影响另一个对象。
由于您的对象是JSON安全的,您可以使用
var newObj = JSON.parse( JSON.stringify( someObj ) );
可以序列化为JSON字符串,然后重新解析为具有相同结构和值的对象。
可能有其他涉及Array.prototype
方法的解决方案,例如reduce
。阅读更多相关信息here。
var temparray1 = [{
title: "hi1",
name: "name1",
age: 1
}, {
title: "hi2",
name: "name2",
age: 2
}, {
title: "hi3",
name: "name3",
age: 3
}];
var temparray2 = [];
for (var aaa = 0; aaa < temparray1.length; aaa++) {
temparray2.push(JSON.parse(JSON.stringify(temparray1[aaa])));
var len = temparray2.length - 1;
temparray2[len].color = "blue";
temparray2[len].gender = "girl";
temparray2.push(JSON.parse(JSON.stringify(temparray1[aaa])));
len = temparray2.length - 1;
temparray2[len].color = "red";
temparray2[len].gender = "boy";
}
console.log(temparray2);
&#13;