繁体   English   中英

jQuery:数组元素在ForLoop中错误地更新

[英]jQuery: Array Element Incorrectly Updates inside ForLoop

我很困惑,我无法理解为什么此代码的结果(执行时)不正确。

我有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中所有项目的颜色和性别分别变为“红色”和“男孩”。 此外,temparray1中当前项目的值也会更新,例如temparray1 [0] = {title:“ hi1”,name:“ name1”,age:1,color:“ red”,gender:boy}。 但是我不打算更新temparray1(第一个数组。)。

请让我知道您对此的想法。 这非常令人困惑。 提前致谢!

您将需要对对象进行深层复制,否则,如果浅层复制,更改一个对象的属性将影响另一个对象。

由于您的对象是JSON安全的,因此您可以使用

var newObj = JSON.parse( JSON.stringify( someObj ) );

可以序列化为JSON字符串,然后重新解析为具有相同结构和值的对象。

可能还有其他涉及Array.prototype方法的解决方案,例如reduce 在此处了解更多信息。

 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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM