Твердая копия массива с экземпляром класса внутри объекта - PullRequest
1 голос
/ 05 марта 2020

Я создаю простую игру с несколькими уровнями. Каждый уровень представлен объектом пар ключ-значение. Внутри каждого уровня также есть массив с новыми экземплярами класса, которые будут загружены внутри уровня. До сих пор это работало нормально, но когда я реализовал кнопку перезапуска, программа не может снова загрузить экземпляры, потому что я уже изменил их. Поэтому мне нужно скопировать экземпляры thoose на уровень, и когда вы нажмете кнопку перезапуска, вы сможете просто скопировать их снова.

Это пример моего объекта уровня.

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);

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Я думаю, что простое решение - преобразовать level4 из константы в функцию. Таким образом, вы можете вызывать его несколько раз и всегда получать экземпляр fre sh.

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
});
2 голосов
/ 05 марта 2020

посмотрите здесь

Я не знаю, как ваши Gate и Block объекты структурированы внутренне. У них могут быть вложенные объекты, которые невозможно скопировать.

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

по статье:

одним простым вариантом будет JSON.parse(JSON.stringify(object)). Это может быть довольно медленно.

Библиотека loda sh также имеет функцию cloneDeep, которая может быть быстрее. У меня нет никаких ориентиров, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...