代码之家  ›  专栏  ›  技术社区  ›  Jacopo Sciampi

复制而不保留参考[副本]

  •  0
  • Jacopo Sciampi  · 技术社区  · 6 年前

    所以我有一个变量叫做 elements 有一堆数据。比方说,就是这样:

    {
      name: "Jeff",
      age: "18",
      carList: [
        "car1": "...",
        "car2": "..."
      ],
      surname: "Matt"
    }
    

    我还有一个空数组,一开始是这样声明的:

    public myArray: Model[] = [];
    

    Model 只是一个包含 .

    我想得到的是一份 元素

    myfunction(){
      //Do stuff that change `car1` from `...` to `hello`
      myArray.push(Object.assign({}, this.elements));
    }
    

    最后,我有一个函数,可以打印 myArray

    function print(){
      this.myArray.forEach(el => {
        console.log(el);
      });
    }
    

    问题是数组的每个元素都有我做的最新更新。 所以如果 myFunction 有好几次被叫去做这样的事:

    • 把“杰夫”改成“杰克”
    • 将年龄“18”改为“25”

    我看到的是三个 log 显示此数据:

    {
      name: "Jeff",
      age: "25",
      carList: [
        "car1": "...",
        "car2": "..."
      ],
      surname: "Seth"
    }
    

    我的问题是:为什么要使用 Object.asign 它还保留着对它的原始对象的引用吗?我应该保留每次修改的历史记录,而不是在我所做的三次编辑中都只保留最后一次编辑。

    非常感谢。

    1 回复  |  直到 6 年前
        1
  •  3
  •   amrender singh    6 年前

    请尝试以下操作:

    JSON.parse(JSON.stringify(element));
    

    let element = { name: "Jeff", age: "18", carList: [ {"car1": "x"}, {"car2": "y"} ], surname: "Matt" };
    
    let result = JSON.parse(JSON.stringify(element));
    result.name = "x";
    
    console.log(result);
    console.log("****element*****");
    console.log(element);