如何在不通过引用传递对象的情况下将对象推入数组?

时间:2019-02-19 12:36:31

标签: javascript ecmascript-6

因此,我在名为“ tiles”的类中有一个属性,其中包含有关棋盘游戏状态的信息。每当我在游戏开始时做出合法举动时,我都试图将这个属性推到一个名为“ moves”的数组中。但是问题是,每当我推送新的tile属性时,moves数组中的先前元素都会更改为最新推送的tile的值。

我知道发生这种情况是因为该对象通过引用传递,因此替换了数组中的旧元素,因为它们现在指向同一对象,这是属性tile的最新值。因此,使用下面给出的代码,有没有一种方法可以推动该对象而不是通过引用,而是通过法律移动而导致的“平铺”的每个不同状态。

这是我的摘录:App.js

App = function () {
  var self = this;
  self.tiles = []; 
  // this is populated with objects from a json file
  //code to fetch json and save it to self.tiles
  //more code

  this.startGame = function () {
    //other code
    self.moves.push(self.tiles);
  };
  this.makeMove = function () {
    //other code
    self.moves.push(self.tiles);
  };
};

所以我期望的是self.moves数组中的图块应该指向不同的对象,而不是同一对象。它应该包含self.tiles的不同状态,但是现在,当我按下该属性时,“ moves”数组的元素将被最新的self.tiles值覆盖。

任何解决此问题的帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:2)

您应该使用JSON.parse(JSON.stringify())克隆嵌套对象。您可以使用Object.assign克隆浅对象

App = function () {
  var self = this;
  self.tiles = []; 
  // this is populated with objects from a json file
  //code to fetch json and save it to self.tiles
  //more code

  this.startGame = function () {
    //other code
    self.moves.push(JSON.parse(JSON.stringify(self.tiles)));
  };
  this.makeMove = function () {
    //other code
    self.moves.push(JSON.parse(JSON.stringify(self.tiles)));
  };
};

答案 1 :(得分:0)

解决问题的唯一方法是将要推送到对象的对象的克隆传递到向量中。在这种情况下,通常会向您的对象编写一个clone()方法,该方法返回其自身的深层副本。该方法返回的对象可以被推到数组中。

答案 2 :(得分:0)

我已经弄弄了一下,发现可以像这样使用散布运算符:

var a = {b: 1, c: 2}
var array1 = []

array1.push({...a})
a.c=3

console.log(array1) // [0: {b: 1, c: 2}]
console.log(a) // {b: 1, c: 3}

MDN: Spread in object literals