Задать вопрос
DarthJS
@DarthJS

Как правильно сделать условие для цикла в данной ситуации на Javascript?

Помогите пожалуйста узреть логику как справиться с циклом в данной ситуации.
У меня есть 2х мерный массив и я хочу проверить на сходство последовтальных символов в разных направлениях(горизонталь, вертикаль, диагоняль).

Мой массив:

var arr = [
[""," "," "," ",""],
[""," "," "," ",""],
[""," "," ","X",""],
["","X","X","X",""],
[""," "," ","X",""]];


Бегу по массиву:

for(var i = 0; i < arr.length; i+=1){
   for(var j = 0; j < arr.length; j+=1){


Проверяю на последовательность в горизонтальном направлении:

if(arr[i][j] == "X" && arr[i+1][j] == "X" && arr[i+2][j] == "X"){

       console.log(arr[i][j]);


На это выдаст ошибку, так как i+1 и i+2 нахоятся за пределами массива

А если внедрить вот такую дополнительную проверку

if(arr[i][j+1] < arr.length)

Тогда не будут проверятся последние рядки

Как быть в данной ситуации?
  • Вопрос задан
  • 279 просмотров
Подписаться 1 Оценить 7 комментариев
Решения вопроса 1
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
Если очень хочется знать всё до грамма, нужно проверять все направления
for (var i = 0, result = []; i < arr.length; i++){
	for (var j = 0, _result = []; j < arr[i].length; j++){
		_result.push({
			t: i == 0 ? null : arr[i][j] === arr[i - 1][j],
			tr: i == 0 || j == arr[i].length - 1 ? null : arr[i][j] === arr[i - 1][j + 1],
			r: j == arr[i].length - 1 ? null : arr[i][j] === arr[i][j + 1],
			br: i == arr.length - 1 || j == arr[i].length - 1 ? null : arr[i][j] === arr[i + 1][j + 1],
			b: i == arr.length - 1 ? null : arr[i][j] === arr[i + 1][j],
			bl: i == arr.length - 1 || j == 0 ? null : arr[i][j] === arr[i + 1][j - 1],
			l: j == 0 ? null : arr[i][j] === arr[i][j - 1],
			tl: i == 0 || j == 0 ? null : arr[i][j] === arr[i - 1][j - 1]
		});
	}

	result.push(_result);
}

console.log(JSON.stringify(result));

Если же достаточно знать, что ячейка непустая и совпадает с любым направлением, можно проще
for (var i = 0, result = []; i < arr.length; i++){
	for (var j = 0, _result = []; j < arr[i].length; j++){
		var status = !!arr[i][j];

		if (!status) {
			status = arr[i][j] === arr[i][j - 1] || arr[i][j] === arr[i][j + 1];

			if (!status && i != 0) {
				status = arr[i][j] && (arr[i][j] === arr[i - 1][j - 1] || arr[i][j] === arr[i - 1][j] || arr[i][j] === arr[i - 1][j + 1]);
			} else if (!status && i != arr.length - 1) {
				status = arr[i][j] && (arr[i][j] === arr[i + 1][j - 1] || arr[i][j] === arr[i + 1][j] || arr[i][j] === arr[i + 1][j + 1]);
			}
		}

		_result.push(status);
	}

	result.push(_result);
}

console.log(JSON.stringify(result));

Пример
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@serega_kaktus
Программист-самоучка, фрилансер
Зачем такой код
if(arr[i][j] == "X" && arr[i+1][j] == "X" && arr[i+2][j] == "X")
во вложенном цикле? Зачем прибавлять константы, если есть переменная i?
// Проход по горизонтали
// Проход по вертикали такой же, только во вложенном цикле поменяйте местами i и j в условии
for(var i = 0; i < arr.length; i+=1){
  countet = 0;
   for(var j = 0; j < arr.length; j+=1){
     var last_counter = counter;
     if (arr[i][j] == 'X') {
        counter++
     }
     else {
       counter = 0;
     }
     // здесь можем сделать нужные вычисления с counter и last_counter. Например, найти максимально длинную последовательность
   }
}
// По диагонали
var counter = 0;
for (var i = 0; i < arr.length; i++) {
  var last_counter = counter;
   if (arr[i][i] == 'X') {
      counter++
   }
   else {
     counter = 0;
   }
   // здесь можем сделать нужные вычисления с counter и last_counter. Например, найти максимально длинную последовательность
}


PS цИкл, диагонАль, ',,,,'
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы