对象中具有类实例的数组的硬拷贝



我正在创建一个具有多个级别的简单游戏。每个级别都由键值对的对象表示。在每个级别中,还有一个数组,其中包含将在该级别中加载的类的新实例。到目前为止,它运行得很好,但当我实现重启按钮时,程序无法再次加载这些实例,因为我已经更改了它们。所以我需要将这些实例硬拷贝到级别中,当您按下重新启动按钮时,您可以再次硬拷贝它们。

这是我的级别对象的一个示例。

const level4 ={
 width:window.innerWidth,
 height:window.innerHeight,
 gates:[new Gate(canvas.width-20, 100,0,-2), new Gate(200, 15,4,-1)],
 blocks:[new Block(50,100,0, 0, 50, 1, 2), new Block(200,200,0, 0, 50, 1, 1)],
 difficulty:'easy',
 id:4
};

我已经尝试用这个解析函数硬拷贝对象,但它不起作用。

const parseLevel = (currentLevel) =>{
  return {
    width: currentLevel.width,
    height: currentLevel.height,
    gates: parseObjects(currentLevel.gates),
    blocks: parseObjects(currentLevel.blocks),
    difficulty: currentLevel.difficulty,
    id: currentLevel.id
  };
};
const parseObjects = (array) =>{
  let newArray = [];
  for(let i of array){
  let newObj = Object.assign( Object.create( Object.getPrototypeOf(i)),i);
  newArray.push(newObj);
  }
return newArray;
};

在我的函数中,我正在加载我调用的级别:

 level = parseLevel(level4);

我认为简单的解决方案是将level4从常量转换为函数。这样,您可以多次调用它,并始终获得一个新实例。

const level4 = () => ({
  width: window.innerWidth,
  height: window.innerHeight,
  gates:[
    new Gate(canvas.width-20, 100,0,-2), 
    new Gate(200, 15,4,-1)
  ],
  blocks:[
    new Block(50,100,0, 0, 50, 1, 2), 
    new Block(200,200,0, 0, 50, 1, 1)
  ],
  difficulty: 'easy',
  id: 4
});

看看这里的

我不知道您的GateBlock对象在内部是如何构造的。它们可能有无法硬拷贝的嵌套对象。

var k = {"a": "b", "c": {"d": "c"}};
var j = Object.assign( Object.create( Object.getPrototypeOf(k)),k);
console.log(j === k)
// false
console.log(k.c === j.c)
// true

根据文章:

一个简单的选择将是CCD_ 4。这可能相当缓慢。

库lodash还有一个可能更快的cloneDeep函数。不过我没有任何基准。

最新更新