Почему не работает обращение к элементу многомерного массива?

245
04 ноября 2017, 16:28

Есть функция getCellsOfSurface, на вход которой подаётся объект objSurface. Структура входного объекта objSurface такова:

var pointsOfSurface=[[1,2,3,4],[5,6,7,8],[1,2,3,4],[5,6,7,8]];
var objSurface = {
   width: 2,
   height: 2,
   vertices: {}
};
objSurface.vertices=pointsOfSurface;

где свойство verteces представляет собой массив, элементами которого являются другие массивы, содержащие 4 числа. Например, [[1,2,3,4], [5,6,7,8], ... , [k, l, m, n]] Если обратится к последнему числу элемента (т.е. номер 3) массива через консоль таким образом objSurface.vertices[204][3], то всё нормально. А в теле функции такой подход не работает.

function getCellsOfSurface(objSurface) {
    var result = [];
    var cell = {
        x: 0,
        y: 0,
        radiation: 0
    };
    var averageRadiation;
    for (var j=1; j<objSurface.height; j++) {
        for (var i=1; i<objSurface.width; i++) {
            averageRadiation=objSurface.vertices[2][3];
            cell['x']=i;
            cell['y']=j;
            cell.radiation=averageRadiation;
            result.push(cell);
        };
    };
    return result;
};

я получаю ошибку Uncaught TypeError: Cannot read property '3' of undefined Почему? Даже выполнив тот же запрос к элементу в коде вне функции всё проходит нормально alert(objSurface.vertices[2][3]);

Функция getSerialNumber работает нормально и возвращает число. Даже если в функции getCellsOfSurface убрать [3] и оставить просто

averageRadiation=objSurface.vertices[2];

то это тоже будет работать но мне возвратит массив [1,2,3,4]. Почему я не могу обратиться глубже?

И ещё они вопрос: в конце выполнения у всех cell.x и cell.y я получаю одно и то же значение 2 и 2. А должны быть возрастающие координаты. Здесь грешу на асинхронность.

Answer 1

Вот Ваш пример. Где ошибка?

var pointsOfSurface = [ 
  [1, 2, 3, 4], 
  [5, 6, 7, 8], 
  [1, 2, 3, 4], 
  [5, 6, 7, 8] 
]; 
 
var objSurface = { 
  width: 2, 
  height: 2, 
  vertices: {} 
}; 
 
objSurface.vertices = pointsOfSurface; 
 
function getCellsOfSurface(objSurface) { 
  var result = []; 
  var cell = { 
    x: 0, 
    y: 0, 
    radiation: 0 
  }; 
  var averageRadiation; 
  for (var j = 1; j < objSurface.height; j++) { 
    for (var i = 1; i < objSurface.width; i++) { 
      averageRadiation = objSurface.vertices[2][3]; 
      cell['x'] = i; 
      cell['y'] = j; 
      cell.radiation = averageRadiation; 
      result.push(cell); 
    }; 
  }; 
  return result; 
}; 
 
console.log(getCellsOfSurface(objSurface));

Вы, совершенно определенно, вылезаете за границу массива. Ищите. Возможные причины: неправильные значения width и height, асинхронность.

А по поводу:

у всех cell.x и cell.y я получаю одно и то же значение

  for (var j = ... j++) {
    for (var i = ... i++) {
      averageRadiation = objSurface.vertices[2][3];
      var cell = { // создаем новый объект
        x: i,
        y: j,
        radiation: averageRadiation
      }
      result.push(cell);
    }
  }
READ ALSO
Как динамически добавить ДИВ и ссылку в React и при этом изменить их атрибуты?

Как динамически добавить ДИВ и ссылку в React и при этом изменить их атрибуты?

Добрый деньЗадача состоит в следующем - есть поле для вводе и кнопка, по нажатию которой происходит запрос на OPM для получения координатов...

274
Как отсортировать массив из объектов по двум свойствам?

Как отсортировать массив из объектов по двум свойствам?

Есть не сортированный массив, который нужно отсортировать по принципу если value текущего элемента равно val следующего то в начале идет текущий...

257
Как сохранить данные с сайта в csv-файл

Как сохранить данные с сайта в csv-файл

Всем приветУ меня очень тупой вопрос

250