пытаясь сохранить значения массива для функции отмены в p5js - PullRequest
1 голос
/ 10 марта 2019

Я сделал своего рода приложение для рисования в p5js - у меня есть многомерный массив с именем points, который состоит из фигур, которые имеют координаты x, y для точек фигур. Итак:

shapes[0][0] = [10,10]
shapes[1][3] = [47,98]

и т.д.

У меня есть функция mousePressed. В то время, когда мышь нажата, прежде чем манипулировать точками этих фигур, я хочу сохранить исходный массив фигур как undoArr.

Затем, когда пользователь перетаскивает мышь, координаты в массиве фигур обновляются. Если пользователь затем решает отменить, у меня есть функция keyPressed, которую я хочу иметь возможность заполнять массив shapes значениями undoArr.

Но что бы я ни пытался - кажется, что массив отмены и массив фигур всегда имеют одинаковые значения, что странно, потому что, если я записываю состояние координаты в массиве фигур:

function mousePressed() {
  if (!isMousePressed){
    undoArr = [...shapes]; //define undoArr as the current shapes array
    console.log(shapes[0][0]); //outputs 10,41 (for example)

и затем зарегистрируйте состояние на mouseReleased:

function handleMouseReleased(){
    console.log(shapes[0][0]); //outputs 69,122 (for example)

Я могу убедиться, что они имеют разные значения в начале и в конце. И я могу проверить из журналов, что mousePressed случайно не запускается каким-либо образом, когда не следует, и то же самое для mouseReleased.

P5js имеет функцию рисования, которая постоянно перемещает точки массива shapes в зависимости от того, куда пользователь перетаскивает их мышью. И в этой функции отрисовки я могу поместить инструкцию log и убедиться, что она срабатывает после mousePressed и до mouseReleased.

Однако, если я пытаюсь сохранить значения массива фигур в mousePressed, undoArr = [...shapes], а затем в keyPressed, попробуйте заполнить массив shapes содержимым undoArr, он ничего не сделает, потому что каким-то образом undoArr всегда содержит те же данные, что и shapes.

Неправильно ли я копирую массив? Я попытался вместо распространения undoArr = shapes.slice(), но это тоже не сработало. Я даже пытался сначала очистить массив, но, похоже, ничего не работает.

A полный текст файла доступен здесь.

1 Ответ

3 голосов
/ 10 марта 2019

Я думаю, что вам здесь нужен глубокий клон вашего многомерного массива. Похоже, вы просто копируете ссылки вместо значений.

Оператор распространения ([...]) не выполняет глубокое клонирование, поэтому объекты, которые он копирует, будут содержать ссылки.

Lodash имеет отличную функцию cloneDeep: https://lodash.com/docs/4.17.11#cloneDeep

или вы можете написать свой собственный.

...