У меня есть некоторые проблемы с выяснением, как работать с 2D-массивом и циклом while.

Вот соответствующий фрагмент кода:

while (
    table[i - count][j] === 0 ||
    table[i + count][j] === 0 ||
    table[i][j - count] === 0 ||
    table[i][j + count] === 0
) { ... count++; }

Я получаю следующую ошибку при запуске моего фрагмента:

Ошибка типа: невозможно прочитать свойство '0' из неопределенного

Теперь я понимаю, что это происходит потому, что если бы у меня был i = 0, то table[i - count][j] был бы проверен table[-1][j]. Очевидно, что это не должно работать, но это цель цикла while, который я реализовал.

Я хочу, чтобы код прекратил работать, когда край этого 2D-массива выходит за границы (как описано выше) или если значение элемента равно 0.

В настоящее время он выдает ошибку, когда мне просто нужно остановить и продолжить работу с кодом после цикла while. Как мне это решить?

РЕДАКТИРОВАТЬ:

Да, я уверен, что хочу, чтобы эти условия были &&. Основная проблема заключается в том, что i -count может привести к отрицательному числу. Или i + count может привести к выходу числа за пределы массива.

Как мне справиться с этими случаями в этом цикле while?

0
Barry Michael Doyle 28 Авг 2017 в 16:43

4 ответа

Лучший ответ

Как уже говорилось ранее, использование я бы предложил использовать функцию, которая возвращает логическое значение. Это сохранит ваш цикл в чистоте, и вы можете выбрать более описательный код для условий.

function validate(array, i, j, count){
  // To cover case when either variable is 0
  if(i && j){
    let prev = array[i - count];
    let next = array[i + count];
    let curr = array[i];

    return (
      (j < prev.length && prev[j] === 0) ||
      (j < next.length && next[j] === 0) ||

      // Since we have already added a check for value !== 0, 
      // we just have to check for out of bound here.
      (j < curr.length -1) && (
        curr[j - count] === 0 ||
        curr[j + count] === 0
      )
    )
  }
  return false;
}
while (validate(table, i, j, count)) { ... count++; }
0
Rajesh 29 Авг 2017 в 06:51

Хорошо, я нашел решение. Это, вероятно, не оптимально в целом, но для того, что я делаю, это идеально:

while (
    i - count >= 0 &&
    j - count >= 0 &&
    i + count < table.length &&
    j + count < table[i].length
) {
    if (
        table[i - count][j] === 0 ||
        table[i + count][j] === 0 ||
        table[i][j - count] === 0 ||
        table[i][j + count] === 0
    ) return prod;

    prod *= (
        table[i - count][j] *
        table[i + count][j] *
        table[i][j - count] *
        table[i][j + count]
    );

    count++;
}
0
Barry Michael Doyle 28 Авг 2017 в 14:45

Предполагая, что ваши условия связаны "and" Просто добавьте дополнительные условия, чтобы проверить допустимые значения / границы для индекса вашего массива.

while (
    table[i - count][j] !== 0 && table[i - count][j] !== undefined &&
    table[i + count][j] !== 0 && table[i + count][j] !== undefined &&
    table[i][j - count] !== 0 && table[i][j - count] !== undefined &&
    table[i][j + count] !== 0 && table[i][j + count] !== undefined &&
    i - count > 0 &&
    j - count > 0
) { ... count++; }
0
thekenobe 28 Авг 2017 в 13:52

Вы должны убедиться, что массив существует до доступа к его ключам, и проверка на 0 или неопределенное значение не имеет значения, так как оба являются falsy :

while(
 (table[i - count] || [])[j] &&
 (table[i + count] || [])[j] &&
 (table[i] || [])[j + count] &&
 (table[i] || [])[j - count]
) count++;
0
Jonas Wilms 28 Авг 2017 в 13:55