У меня есть проект, который требует следующего.
Четыре кода будут объявлены в коде как таковые:
var ROW1 = ['module1'];
var ROW2 = ['module2', 'module3'];
var ROW3 = ['module4', 'module5', 'module6'];
var ROW4 = ['module7', 'module8'];
Каждый элемент этих массивов представляет модуль в настраиваемом HTML-виджете. Исходя из того, какие элементы указаны в каждом массиве, код будет создавать HTML-код, представляющий эти «модули» - каждый массив «ROWx» будет строкой таблицы (), а каждый модуль - ячейкой таблицы () в таблице.
ROW1 может быть пустым (в этом случае он не будет включен в HTML) или иметь один модуль, «module1».
ROW2, ROW3 и ROW4 могут иметь от 0 до 3 модулей (любой из module2 - module8 в любом порядке).
Используя приведенные выше примеры массивов, я программно сгенерировал бы таблицу HTML, подобную этой:
<table>
<tr id="row1">
<td colspan="6">[module1]</td>
</tr>
<tr id="row2">
<td colspan="3">[module2]</td>
<td colspan="3">[module3]</td>
</tr>
<tr id="row3">
<td colspan="2">[module4]</td>
<td colspan="2">[module5]</td>
<td colspan="2">[module6]</td>
</tr>
<tr id="row4">
<td colspan="3">[module7]</td>
<td colspan="3">[module8]</td>
</tr>
</table>
(Кольспаны просто для того, чтобы сохранить правильную компоновку таблицы; 6 - это наименьшее общее кратное между 1, 2 и 3.)
Проблема в том, что содержимое этих модулей заполняется динамически (я получаю его из вызова AJAX по URL-адресу, который возвращает объект JSON), а содержимое не всегда доступно для каждого модуля. Вместо того чтобы создавать пустую ячейку () для модуля без содержимого, я хочу полностью удалить эту ячейку из макета, действуя так, как будто она никогда не была в исходной конфигурации (то есть в массивах сверху).
Я уже потратил много времени на создание кода, который абстрагирует создание модуля - он создает макет «оболочки» HTML на основе количества модулей в каждой строке, а затем добавляет содержимое в соответствующую ячейку таблицы, на основе которой модуль должен быть там. Я хотел бы иметь возможность продолжать использовать этот код, поэтому я думаю, что лучший способ сделать это - просмотреть каждый элемент массива перед созданием «оболочки», и, если у меня нет содержимого, удалить этот элемент. из массива. Затем я могу использовать вновь модифицированный массив для создания «оболочки» в обычном режиме - я просто обрабатываю ее заранее, чтобы проверить содержимое в каждом модуле, и, если ни один из них не доступен, действует так, как будто этот модуль никогда не устанавливался в исходном массиве (удалив его в новом массиве, а затем используя его для создания «оболочки»).
Например, допустим, конфигурация настроена так:
var ROW1 = ['module1'];
var ROW2 = ['module4', 'module2'];
var ROW3 = ['module5'];
var ROW4 = ['module7', 'module3', 'module8'];
Я хочу просмотреть каждый элемент в каждом массиве и проверить наличие содержимого в модуле. Допустим, что для «module3» и «module5» нет содержимого. Я хочу затем получить эти массивы:
var ROW1 = ['module1'];
var ROW2 = ['module4', 'module2'];
var ROW3 = ['module7', 'module8'];
Обратите внимание, что произошло со строками - поскольку «module5» был удален, элементы из массива ROW4 были перемещены в ROW3, а затем был удален ROW4. Кроме того, в новом ROW3 (ранее ROW4) «module3» был удален, сдвинув «module8» из положения [2] в положение [1].
Итак:
- Для всех строк, у которых после удаления модулей остается один или несколько элементов, но у которых нет содержимого, я бы хотел сохранить строку без изменений, даже с одним модулем.
- Для любых строк, которые заканчиваются без элементов, я бы хотел сместить каждую последующую строку «вверх» в предыдущий массив, в основном вытягивая ряд и сдвигая нижние вверх. HTML-код из этого примера будет выглядеть так:
ДО (в соответствии с запросом конфигурации):
<table>
<tr id="row1">
<td colspan="6">[module1]</td>
</tr>
<tr id="row2">
<td colspan="3">[module4]</td>
<td colspan="3">[module2]</td>
</tr>
<tr id="row3">
<td colspan="6">[module5]</td>
</tr>
<tr id="row4">
<td colspan="2">[module7]</td>
<td colspan="2">[module3]</td>
<td colspan="2">[module8]</td>
</tr>
</table>
ПОСЛЕ (в зависимости от того, какой контент действительно доступен)
<table>
<tr id="row1">
<td colspan="6">[module1]</td>
</tr>
<tr id="row2">
<td colspan="3">[module4]</td>
<td colspan="3">[module2]</td>
</tr>
<tr id="row3">
<td colspan="3">[module7]</td>
<td colspan="3">[module8]</td>
</tr>
</table>
Напомним, что ROW1 является особым случаем, поскольку он не влияет на другие строки. Если контент доступен для «module1» (единственный модуль, который может идти в ROW1), тогда ROW1 должен существовать нетронутым. Если контент недоступен, тогда ROW1 может быть удален, но при этом ROW2, ROW3 и ROW4 остаются без изменений (т.е. не сдвигая их каждый вверх по строке). Мне действительно нужно только решение для обработки ROW2, ROW3 и ROW4, поскольку логика для ROW1 довольно проста.
Я начинающий / промежуточный программист JavaScript, и у меня нет большого опыта работы с массивами. Я работал над этим время от времени, но просто не чувствую, что то, что я придумываю, является надежным или элегантным / компактным методом.
Если какой-нибудь гуру JavaScript может поделиться решением для этого, я бы ОЧЕНЬ признателен за это! Спасибо большое.