Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2023, 14:12   #1
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию Функцию бы покороче

Здравствуйте. Есть код, который работает, но уж больно похож на индусский. Помогите сделать его красивым))

https://jsbin.com/waxugom/edit?js,output
Код:

let arr = ['n', 'n', 0, 0, 0, 'n', 1, 1, 2, 2, 2, 2, 2, 'n', 'n', 3];

let html = '<table><tr>';
for (let i=0; i<arr.length; i++) { html += `<th>${i+1}</th>`; }
html += '</tr>';

html += '<tr>';
let mem = 0;
for (let i=0; i<arr.length; i++) {
	if (i >= arr.length || arr[i] != arr[i+1]) {
		if (arr[i] == 'n') {
			html += "<td></td>";
		} else {
			html += `<td colspan="${++mem}">${arr[i]+1}</td>`;
			mem = 0;
		}
	} else {
		if (arr[i] == 'n') {
			html += "<td></td>";
			mem = 0;
		} else {
			mem++;
		}
	}
}
html += '</tr></table>';

document.body.insertAdjacentHTML("beforeend", html);
Есть массив в котором могут быть значения:
'n' - пустые ячейки
1, 2, 3, и тд - разные отдельные блоки

Нужно создать таблицу, чтобы 'n' превратились в пустые ячейки, а блоки 1, 1, 1 в ячейку с colspan="3", 2, 2, 2, 2, 2 в ячейку с colspan="5", и тд

Мой код решает эту задачу, но он совсем некрасивый
Изображения
Тип файла: jpg Аннотация 2023-02-11 140633.jpg (8.0 Кб, 24 просмотров)

Последний раз редактировалось Parallelogram; 11.02.2023 в 16:12.
Parallelogram вне форума Ответить с цитированием
Старый 11.02.2023, 14:23   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

У вас цикл до
Код:
i<arr.length
смысл в проверке
Код:
i >= arr.length
?

Код:
arr[i] != arr[i+1]
С чем будет последний элемент сравниваться?
p51x вне форума Ответить с цитированием
Старый 11.02.2023, 14:34   #3
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

p51x,

i >= arr.length нужна для последнего элемента
arr[i] != arr[i+1] будет проверяться на всех итерациях кроме последнего, там сработает i >= arr.length иначе ошибку выдаст
Parallelogram вне форума Ответить с цитированием
Старый 11.02.2023, 15:50   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Parallelogram Посмотреть сообщение
i >= arr.length нужна для последнего элемента
Тогда надо проверять значение i+1, а не i. Цикл for закончится при i == arr.length и это условие всегда будет false

Последний раз редактировалось macomics; 11.02.2023 в 16:01.
macomics вне форума Ответить с цитированием
Старый 11.02.2023, 16:03   #5
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Тогда надо проверять значение i+1, а не i. Цикл for закончится при i == arr.length и это условие всегда будет true
Да нееее. arr[i] != arr[i+1] нужен для того, чтобы определить, закончился этот блок или ещё нет. Если следующий элемент тоже будет с тем же значением, то значит блок ещё не закончился. Мы прибавляем mem++ и начинаем заново.
Parallelogram вне форума Ответить с цитированием
Старый 11.02.2023, 16:06   #6
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Алгоритм такой: беру первый элемент и сравниваю его со следующим, если он такой же, то mem++ и continue. Если другой, то записываю colspan=mem и continue начинаю новый блок.
Parallelogram вне форума Ответить с цитированием
Старый 11.02.2023, 16:26   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Parallelogram Посмотреть сообщение
Да нееее. arr[i] != arr[i+1] нужен для того, чтобы определить, закончился этот блок или ещё нет. Если следующий элемент тоже будет с тем же значением, то значит блок ещё не закончился. Мы прибавляем mem++ и начинаем заново.
Я вам написал только про часть условия с i >= arr.length. У цикла for не будет итерации с таким значением счетчика. А вот при i = arr.length - 1 (последний элемент массива) вы как раз и вылезете за его пределы во второй части условия (arr[i] != arr[i + 1]). Тогда значение arr[i+1] окажется вне массива arr (i+1 = arr.length), а это уже элемент на один дальше конца массива.
macomics вне форума Ответить с цитированием
Старый 11.02.2023, 16:59   #8
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Я вам написал только про часть условия с i >= arr.length.
Можно заменить на i == arr.length. Это вообще не играет роли.

Или Вы не запускали скрипт или я совсем ничего не понимаю.
Мой код абсолютно рабочий. Мне просто не нравится дублирование кода в цикле. Скорей всего это можно как-то исправить/переписать. Вот об этом я прошу. Вы же предлагаете сломать условие if до нерабочего варианта.
Parallelogram вне форума Ответить с цитированием
Старый 11.02.2023, 17:09   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Что в условии
Код:
if ((i+1 == arr.length) || (arr[i] != arr[i+1]))
не рабочее. А вот за пределы массива с этим условием вы не вылезете.

Если чтобы оценить программу вам надо ее запустить, тогда добавьте вывод в консоль 4-х значений из цикла:
i, i+1, arr[i] и arr[i+1]
Дальше оцените сами полученный вывод.

P.S. Вам два человека на форуме указывают на одно и тоже место в программе. Но вы продолжаете препираться, вместо того чтобы проверить.

add: я за вас сделал вывод, чтобы вы больше не препирались, а прислушались
Изображения
Тип файла: png array.png (8.6 Кб, 16 просмотров)

Последний раз редактировалось macomics; 11.02.2023 в 17:26.
macomics вне форума Ответить с цитированием
Старый 11.02.2023, 17:23   #10
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Вы правы. Я совсем о другом думал и не видел в упор что мне говорят.
Либо i+1 == arr.length, либо i == arr.length-1. Мне же так и говорили :facepalm:
Но всё тлен, это условие не нужно, хоть и правильное. Так как arr[i] != arr[i+1] в последнем элементе сравнивается с undefined и всё равно выполняется корректно.

Последний раз редактировалось Parallelogram; 11.02.2023 в 17:35.
Parallelogram вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
написать функцию, определяющую пол продавца. Используя функцию, вывести продавцов - мужчин Nuc SQL, базы данных 12 12.03.2018 10:12
В функцию с переменным числом параметроы передать указатели на функцию Вероника99 Помощь студентам 3 05.10.2016 15:44
Написать функцию «Факториал» и программу, использующую эту функцию для вывода таблицы факториалов. Rufer Помощь студентам 1 20.06.2016 12:53
[Язык LISP] Используя функцию DEFUN, определить функцию DemonXZ Помощь студентам 0 09.06.2013 18:10
Описать функцию нахождения расстояния между 2-мя точками на плоскости, заданными своими координатами, и функцию .... zzz6 Помощь студентам 2 06.07.2011 08:24