因此,我在名为“ 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值覆盖。
任何解决此问题的帮助将不胜感激。谢谢!
答案 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}