Нарисовать таблицу с динамическим объединением ячеек в первом и втором столбце
Всем доброго дня!
Недавно задавал вопрос по поводу подсчета строк с идущими друг за другом одинаковыми элементами вот этого массива с вложенными массивами строк (фрагмент ниже). Массив уже отсортирован по нулевым и потом первым элементам вложенных массивов.
["02.01.01.02.Формирование программы","Ответственный за формирование Программы ","Формирование/ Корректировка Программы ","Исполнитель"],
["02.01.01.02. Формирование программы","Ответственный за формирование Программы","Проведение совещания по рассмотрению и утверждению Программы","Консультант"],
["02.01.01.04. Корректировка годовой инвестиционной программы","Куратор статьи ИП","Формирование комментариев по отклонениям ИП","Исполнитель"],
["02.01.01.05. Разработка квартальных инвестиционных программ","Куратор статьи ИП","Формирование плана на следующий квартал","Исполнитель"],
["02.01.01.05. Разработка квартальных инвестиционных программ","Куратор статьи ИП","Консолидация проекта квартального плана","Консультант"],
["02.01.02.02. Мониторинг инвестиционной программы","Куратор статьи ИП","Проведение ежеквартального мониторинга","Консультант"],
["02.01.02.02. Мониторинг инвестиционной программы","Куратор статьи ИП","Формирование месячного отчета по фактическому исполнению по направлению","Исполнитель"],
["02.01.02.02. Мониторинг инвестиционной программы","Куратор статьи ИП","Проведение анализа изменений лимитов инвестиций","Консультант"],
["02.01.02.02. Мониторинг инвестиционной программы","Куратор статьи ИП","Проведение анализа изменения объемных показателей за год","Консультант"]];```
Полученные ответы помогли продвинуться и подойти вплотную к задаче вывода этой таблицы. Но сижу с этой задачей уже 3й день и пока смог добиться только динамического объединения ячеек 1м столбце. И пока не могу придумать, как объединять еще и ячейки во втором столбце. Под "динамическим" имею ввиду,что количество объединяемых ячеек рассчитывается в момент формирования таблицы.
Итак, есть вышеупомянутый массив с вложенными массивами строк. Нулевые и первые элементы вложенных массивов могут быть одинаковыми в случайном порядке. Когда одинаковые элементы выводятся в таблицу, их надо объединять. Чтобы получилась таблица вида
[![Пример таблицы для последних 4х строк массива][1]][1]
[1]: https://i.stack.imgur.com/5lVwy.jpg
Т.к. я пока еще не настоящий программист, то с алгоритмами у меня слабо. Плюс накладывает ограничения то, что отчет делается не для веба, а как бы на внутреннем скриптовом языке спецсофта, соответствующего требованиям ES4. Таблицы тоже формируются своеобразно, могу ошибаться но в html логика немного другая по-моему.
Вот фрагмент статичного кода, который формирует таблицу как на картинке выше (1я цифра, которая в скобках идет после строковой части, отвечает за количество объединяемых ячеек).
oO.TableRow();
//peaceOfBigArr[5][0]
oO.TableCell("02.01.02.02. Мониторинг инвестиционной программы (квартал/год/месяц)",4,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
//peaceOfBigArr[5][1]
oO.TableCell("Куратор статьи AAA",2,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
//peaceOfBigArr[5][3]
oO.TableCell("Проведение ежеквартального мониторинга фактического исполнения ИП",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
//peaceOfBigArr[5][4]
oO.TableCell("Консультант",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
oO.TableRow();
//peaceOfBigArr[6][3]
oO.TableCell("Формирование месячного/ квартального отчета по фактическому исполнению по направлению",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
//peaceOfBigArr[6][4]
oO.TableCell("Исполнитель",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
oO.TableRow();
//peaceOfBigArr[7][1]
oO.TableCell("Куратор статьи BBB",2,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
//peaceOfBigArr[7][3]
oO.TableCell("Проведение анализа изменений лимитов инвестиций",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
//peaceOfBigArr[7][4]
oO.TableCell("Исполнитель",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
oO.TableRow();
//peaceOfBigArr[8][3]
oO.TableCell("Проведение анализа изменения объемных показателей за год",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
//peaceOfBigArr[8][4]
oO.TableCell("Консультант",1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0); ```
У меня алгоритм планировался укрупненно такой:
- Прогоняю по всему массиву функцию, которая считает количество строк, с одинаковыми нулевыми элементами. Получаю новый массив с длинами "серий".
- Отрезаю в минимассив от большого массива количество строк, равных длине первой серии.
- Прогоняю по нему функцию подсчета серий по первым элементам вложенных массивов (пока не использую этот шаг).
- Вывожу в таблицу минимассив с объединенными первыми ячейками ("Вывожу" в данном случае - в память. Окончательно в файл все пишется когда в памяти сформирована вся таблица. Это механизм вывода такой в ПО реализован.)
- Беру следующий элемент из массива со счетчиками серий нулевых элементов, отрезаю кусок от большого массива и т.п. на рекурсию не заморачиваюсь, просто в цикле бы реализовать все сначала.
В целом все работает, за исключением того, что я пока не придумал как внутрь кода, который выводит таблицу с объединенными ячейками 1го столбца увязать еще код, объединяющий ячейки 2го столбца. Сломал всю голову уже. Идея где-то рядом, но не могу ухватить. Надеюсь рассказал все понятно. Ну и напоследок работающий фрагмент кода, которые сейчас выводит таблицу с объединенными ячейками 1го столбца:
var countBpArray = count(bigArray,0);
//Dialogs.MsgBox(countBpArray.join("\n"));
for (var i=0; i<countBpArray.length; i++){
var peaceOfBigArr = bigArray.splice(0,countBpArray[i]);
oO.TableRow();
oO.TableCell(peaceOfBigArr[0][0],countBpArray[i],1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
oO.TableCell(peaceOfBigArr[0][1],1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
oO.TableCell(peaceOfBigArr[0][3],1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
oO.TableCell(peaceOfBigArr[0][4],1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
if (countBpArray[i]>1){
for (var j=1;j<countBpArray[i];j++){
oO.TableRow();
oO.TableCell(peaceOfBigArr[j][1],1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
oO.TableCell(peaceOfBigArr[j][3],1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
oO.TableCell(peaceOfBigArr[j][4],1,1,"Times New Roman",8,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);
}
}
}
oO.EndTable("",100,"Times New Roman",12,Constants.C_BLACK,Constants.C_TRANSPARENT,0,Constants.FMT_LEFT,0);