Не видит массив [как сохранить массиве ссылоки на ячейки таблицы?]

	var table = document.createElement("table");
	function buildTableArray(n) {
		var arr = [];
		for (var i = 0; i < n; i++) {
			arr[i] = table.insertRow(i);
			for (var j = 0; j < n; j++) {
				arr[i][j] = arr[i].insertCell(j);
			}
		}
		return arr;
	}
	function freeCells(array) {
		var arr = [];
		var k = 0;
		var l = array.length;
		for (var i = 0; i < l; i++) {
			for (var j = 0; j < l; j++) {
				arr[k] = `${i} ${j}`;
				k++;
			}
		}
		return arr;
	}
	function checkCell(array, i, j) {
		var pattern = `${i} ${j}`;
		if (array.indexOf(pattern)) {
			array.splice(array.indexOf(pattern), 1);
			return true;
		}
		return false;
	}
	function buildTable(n, i, j, array) {
		for (let k = 1; k <= Math.pow(n, 2); k++) {
			console.log(array);
			array[i][j].innerHTML = k;
			if (checkCell(array, i - 1, j)) i--;
			if (checkCell(array, i + 1, j)) i++;
			if (checkCell(array, i, j - 1)) j--;
			if (checkCell(array, i, j + 1)) j++;
		}
	}
	var build = buildTableArray(2);
	console.log(buildTable(2, 0, 1, build));

доброго времени суток! нужно запомнить таблицу числами определенным образом. функции написал, проверяю на логе работу функции buildTable, а там таблица непонятно как выводится
image
притом что если вывести таблицу чисто, вне функции, все выводится как нужно. подскажите пожалуйста в чем проблема?

image

вот. это вывод вне функции

В коде перемешаны 2 концепции: массив данных и таблица.

Тут в элемент массива записывается ссылка на узел строки таблицы. Наверное ты хотел записать массив чтобы потом наполнить его ссылками на созданные td. В консоли видно то что я описываю: массив из tr.

А потом в свойство этого узла записывается ссылка на созданную ячейку.

Код выглядит как будто он должен выдавать на выходе массив массивов типа

[[td, td, td],
 [td, td, td]]

Непонятна задача функции freeCells. Потому что array будет двумерным но не гарантированно “квардатным” (одинаковое количество рядов и строк), а код написан как будто массив “квадратен”.

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

функция buildTableArray создает одновременно таблицу и вносит ячейки в переменные. функция freeCells создает массив индексов свободных ячеек. функция checkCell проверяет введенные индексы на существование в массиве, который создала функция freeCells, и если существует, удаляет элемент массива с этими индексами. функция buildTable заполняет массив buildTableArray значениями

расскажу по-русски как это все должно работать. создается таблица n x n. она заполняется значениями от 1 до n^2 так чтобы каждая ячейка с значениями х и х-1 имела общую сторону и выглядит это примерно так:
image

да, ты прав. этого я и хочу добиться

	var table = document.createElement("table");
	function buildTableArray(n) {
		var arr = [];
		for (var i = 0; i < n; i++) {
			arr[i] = table.insertRow(i);
			for (var j = 0; j < n; j++) {
				arr[i][j] = arr[i].insertCell(j);
			}
		}
		return arr;
	}
	function freeCells(array) {
		var arr = [];
		var k = 0;
		var l = array.length;
		for (var i = 0; i < l; i++) {
			for (var j = 0; j < l; j++) {
				arr[k] = `${i} ${j}`;
				k++;
			}
		}
		return arr;
	}
	function checkCell(array, i, j) {
		console.log(array);
		var pattern = `${i} ${j}`;
		if (array.indexOf(pattern)) {
			array.splice(array.indexOf(pattern), 1);
			return true;
		}
		return false;
	}
	function buildTable(n, i, j, array, array1) {
		var pattern = `${i} ${j}`;
		array1.splice(array1.indexOf(pattern), 1);
		for (let k = 1; k <= Math.pow(n, 2); k++) {
			console.log("i = " + i);
			console.log("j = " + j);
			console.log(array[i][j]);
			array[i][j].innerHTML = k;
			if (checkCell(array1, i, j - 1)) {j--; continue;}
			if (checkCell(array1, i + 1, j)) {i++; continue;}
			if (checkCell(array1, i, j + 1)) {j++; continue;}
			if (checkCell(array1, i - 1, j)) {i--; continue;}
		}
	}
	var build = buildTableArray(2);
	console.log(buildTable(2, 0, 1, build, freeCells(build)));

собственно смотри что у меня выводит в консоль такой код
image

все верно. только не пойму как индексы изменяются

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

var table = document.createElement("table");

function buildTableArray(n, table) {
	var arr = [];
	for (var i = 0; i < n; i++) {
		var row = table.insertRow(i);
		arr[i] = []
		for (var j = 0; j < n; j++) {
			arr[i][j] = row.insertCell(j);
		}
	}
	return arr;
}

var arr = buildTableArray(2, table)
console.log(arr)

Вот эта работает как надо. Обрати внимание что я делаю вместо arr[i] = table.insertRow(i);. Плюс и передаю table аргументом.

хорошо, изменил. на будущее буду так и делать. это также решило проблему во второй функции, ибо мне приходилось делать фиксированное кол-во строк/столбцов. потому что не видело ячеек

Вот этот момент не понятен с точки зрения полезности. Зачем удалять элементы из массива? Думаешь это отразиться на том как выглядит таблица?

ну. чтобы программа не присваивала значения элементам уже со значениями. и чтоб не вылазило за границы массива. своеродный компас

Я пока не смог сложить полную картинку в голове. Но на сколько я понял проблем пока не осталось, так?

ну. программа все выводит как надо, да. только индексы я не пойму как оно меняет. посмотри на лог выше. по условию же индексы должны совпадать с ячейками массива, и только тогда присваиваться. но в логе невооруженным глазом видно, что свободна только ячейка [0][0], и при этом программа декременирует j, а не i. и массив идет в никуда
вот этот момент мне не понятен. да и если увеличить n, массив проходит такой же путь

Умеешь пользоваться дебаггером? Я в прошлый раз давал ссылку. Он сильно поможет понять какие значения внутри программы.

Мне не удается вникнуть в программу. Она сложнее чем та что могла бы поместиться в моей голове. А большее время я не могу уделить сейчас.

хорошо, спасибо за помощь

ну в общем, это мне тоже урок на будущее. не писать в условии просто
if (array.indexOf(pattern))
, a писать
if (array.indexOf(pattern) !== -1).

всегда думал если в в условии отрицательное число, то это автоматически false. но нет, как оказывается

1 лайк

По этой теме: всего 5 значений, которые считаются как false в условиях, циклах итд: false, null, undefined, 0, NaN.

И быстрый способ проверить будет ли условие воспринимать значение как false, это взять двойное отрицание значения. Если результат true, то и программа будет вести себя будто значение true. Это еще называют falsy-значения и truthy-значения.

console.log(!!-1) // true
console.log(!!null) // false
1 лайк

хорошо, спасибо