Почему я получаю Uncaught TypeError: свойство 4 не определено при цикле через 2d массив? - PullRequest
1 голос
/ 26 февраля 2020

Итак, я строю тетрис. После создания массива данных, я пытаюсь реализовать гравитацию, проверяя каждую строку в массиве, если она «заполнена», а также возможность пустого пространства под ним. Тем не менее, это дает мне ошибку, которая предполагает, что что-то не определено. Я пробовал a для l oop и a для ... l oop, а также гуглил. Почему я получаю эту ошибку и как ее исправить?

const editor = document.getElementById("edit");
var data = [];

function array(x, text) {
  var y = [];
  for (var i = 0; i < x - 1; i++) {
    y.push(text);
  }
  return y;
}

for (var i = 0; i < 20; i++) {
  data.push(array(10, "b"));
}

function draw() {
  var j;
  var i;
  var dataOut = data;
  for (i = 0; i < data.length; i++) {
    for (j = 0; j < data[i].length; j++) {
      if (data[i][j] == "a" && data[i + 1][j] == "b") {
        if (i < data.length - 1) {
          dataOut[i][j] = "b";
          dataOut[i + 1][j] = "a";
        }
      }
    }
  }
  data = dataOut;
  console.log(data);
  requestAnimationFrame(draw);
}
data[0][4] = "a";
requestAnimationFrame(draw);

1 Ответ

1 голос
/ 26 февраля 2020

с for-of-l oop вы итерируете только объекты / значения массива, а не индексы.

используйте только for-l oop для использования индексов

const editor = document.getElementById("edit");
var data = [];

function array(x, text) {
  var y = [];
  for (var i = 0; i < x - 1; i++) {
    y.push(text);
  }
  return y;
}

for (var i = 0; i < 20; i++) {
  data.push(array(10, "b"));
}

function draw() {
  var dataOut = data;
  for (let i = 0; i < data.length - 1; i++) { // logical error here
    for (let j = 0; j < data.length; j++) {
      if (data[i][j] == "a" && data[i + 1][j] == "b") {
        if (i < data.length - 1) {
          dataOut[i][j] = "b";
          dataOut[i + 1][j] = "a";
        }
      }
    }
  }
  data = dataOut;
  console.log(data);
  requestAnimationFrame(draw);
}
data[0][4] = "a";
requestAnimationFrame(draw);

Простой пример for-of-l oop

const arr = ["aa","bb"]
for(let a of arr) console.log(a);
// will print
/*
aa
bb
*/
for(let a = 0; a < arr.length; a++) console.log(a);
// will print
/*
0
1
*/
...