【问题标题】:jQuery: Array Element Incorrectly Updates inside ForLoopjQuery:数组元素在 For 循环内错误更新
【发布时间】:2018-08-14 02:48:28
【问题描述】:

我很困惑,我不明白为什么这段代码的结果(执行时)不正确。

我有 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(第一个数组)。

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

【问题讨论】:

  • 您是在推送整个对象,而不是复制一个对象——因此对该对象的任何更改都会影响它所引用的所有位置。
  • 明白了。谢谢!

标签: javascript jquery html arrays for-loop


【解决方案1】:

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

由于您的对象是 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);

【讨论】:

  • 太棒了!它工作得很好。我现在明白了。非常感谢。
猜你喜欢
  • 2021-11-22
  • 1970-01-01
  • 2018-06-10
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2022-07-07
相关资源
最近更新 更多