【问题标题】:All objects are affected in an array数组中的所有对象都受到影响
【发布时间】:2018-04-15 22:33:21
【问题描述】:

示例:

test = {one: 1, two: 'two', three: 3};

arr = [];
arr.unshift(test);
arr.unshift(test);
arr.unshift(test);

arr[0].two = 2;

结果:

我想要什么?我只想更改first array 的值,当我访问arr[index].two 时,其他的值仍然是two。我能做些什么来解决这个问题?

【问题讨论】:

  • 您正在将相同的引用推送到数组中。
  • 为数组中的 eact 项创建一个新对象。
  • @DanielA.White 做类似arr.unshift(new Object(test)) 的事情我得到了同样的结果,你能告诉我我需要做什么吗?

标签: javascript arrays object


【解决方案1】:

这是因为您实际上添加了 3 个对同一个对象的引用。所以任何修改都会影响数组中的 3 个条目。

您想要的是为每个条目创建对象的不同副本,因此它们在逻辑上都是不同的,并且可以单独修改。

您可以使用Object.assign({}, yourModelObject) 来实现此目的。

例如,看下面的 sn-p :

let test = {one: 1, two: 'two', three: 3};
let arr = [] 

arr.unshift(Object.assign({}, test));
arr.unshift(Object.assign({}, test));
arr.unshift(Object.assign({}, test));

arr[0].two = 2
console.log(arr)

【讨论】:

    【解决方案2】:

    您正在推动/取消转移相同的参考。
    使用Object.create(...) 创建新引用,然后您将能够修改数组中的任何单个实例

    Object.create()方法创建一个新对象,使用现有对象提供新创建对象的__proto__

    let test = {
      one: 1,
      two: 'two',
      three: 3
    };
    
    let arr = [];
    arr.push(Object.create(test));
    arr.push(Object.create(test));
    arr.push(Object.create(test));
    
    arr[0].two = 2;
    
    console.log(arr[0].two)
    console.log(arr[1].two)
    console.log(arr[2].two)

    【讨论】:

    • 这创建了 3 个对象,test__proto__
    • 如果您使用 console.log(arr) 注销整个 arr,它会显示没有成员的对象数组,但如果您仍然可以访问此类对象的成员