【问题标题】:When copying Javascript array elements, properties become linked复制 Javascript 数组元素时,属性变为链接
【发布时间】:2019-01-09 09:34:35
【问题描述】:

我经常给数组元素属性,这样我就不需要使用嵌套数组了。但是,当我使用array.push(array[0]) 甚至array[array.length] = array[0] 复制数组元素时,它们的新元素和复制的元素正在链接——当我更改其中一个的属性时,它会更改另一个的属性。

代码如下:

var array = [{num: 0}, {num: 1}, {num: 2}, {num: 3}];
var i;
var nums = "";
array.push(array[0]);

//What the array looks like before anything is changed
for (i = 0; i < array.length; i += 1) {
    nums += array[i].num + " ";
}
console.log(nums);

array[0].num = 1;

//What the array looks like after changing only one element
nums = "";
for (i = 0; i < array.length; i += 1) {
    nums += array[i].num + " ";
}
console.log(nums);

运行时,array 的第一个和最后一个元素都会更改,尽管只运行了array[0].num = 1。有谁知道发生了什么以及我该如何解决?

【问题讨论】:

  • 对象值是引用。将对象引用从一个地方分配到另一个地方不会产生副本。
  • @JamesFaix 当你拒绝this edit 时,你有没有看一下 jsfiddle 链接?代码完全相同,并且编辑直接在帖子中内联了代码,并提供了一种直接从 SO 运行/执行 sn-p 的方法。你没有理由拒绝那里的编辑。
  • "属性以便我不需要使用嵌套数组" - 抱歉,什么?您能否详细说明为什么您认为需要对象数组(或数组数组)而不是简单地使用数字数组?

标签: javascript arrays oop properties


【解决方案1】:

这是因为数组的元素是对象。您只是将一个对象的引用分配给多个数组。如果要将对象中的数据复制到全新的对象中,则必须clone them。对于简单的对象,这样的事情应该可以满足您的需求。

function clone(obj){
    return JSON.parse(JSON.stringify(obj));
}
var array = [{num: 0}, {num: 1}, {num: 2}, {num: 3}];
array.push(clone(array[0]));

【讨论】:

    猜你喜欢
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 2015-04-27
    相关资源
    最近更新 更多