sorting done
This commit is contained in:
87
labs/lab1/JavaScript/sort.js
Normal file
87
labs/lab1/JavaScript/sort.js
Normal file
@@ -0,0 +1,87 @@
|
||||
/*формируем массив для сортировки по двум уровням вида
|
||||
[
|
||||
{column: номер столбца, по которому осуществляется сортировка,
|
||||
direction: порядок сортировки (true по убыванию, false по возрастанию)
|
||||
},
|
||||
...
|
||||
]
|
||||
*/
|
||||
const createSortArr = (data) => {
|
||||
let sortArr = [];
|
||||
|
||||
const sortSelects = data.getElementsByTagName('select');
|
||||
|
||||
for (const item of sortSelects) {
|
||||
// получаем номер выбранной опции
|
||||
const keySort = item.value;
|
||||
// в случае, если выбрана опция Нет, заканчиваем формировать массив
|
||||
if (keySort == 0) {
|
||||
break;
|
||||
}
|
||||
// получаем порядок сортировки очередного уровня
|
||||
// имя флажка сформировано как имя поля SELECT и слова Desc
|
||||
const desc = document.getElementById(item.id + 'Desc').checked;
|
||||
// очередной элемент массива - по какому столбцу и в каком порядке сортировать
|
||||
sortArr.push(
|
||||
{
|
||||
column: keySort - 1,
|
||||
direction: desc
|
||||
}
|
||||
);
|
||||
}
|
||||
return sortArr;
|
||||
};
|
||||
|
||||
const numberColumns = [4, 5]
|
||||
|
||||
const sortTable = (idTable, formData) => {
|
||||
|
||||
// формируем управляющий массив для сортировки
|
||||
const sortArr = createSortArr(formData);
|
||||
|
||||
// сортировать таблицу не нужно, во всех полях выбрана опция Нет
|
||||
if (sortArr.length === 0) {
|
||||
clearTable(idTable)
|
||||
return false;
|
||||
|
||||
}
|
||||
//находим нужную таблицу
|
||||
let table = document.getElementById(idTable);
|
||||
|
||||
// преобразуем строки таблицы в массив
|
||||
let rowData = Array.from(table.rows);
|
||||
|
||||
// удаляем элемент с заголовками таблицы
|
||||
const headerRow = rowData.shift();
|
||||
|
||||
//сортируем данные по всем уровням сортировки
|
||||
rowData.sort((first, second) => {
|
||||
for (let { column, direction } of sortArr) {
|
||||
const firstCell = first.cells[column].innerHTML;
|
||||
const secondCell = second.cells[column].innerHTML;
|
||||
|
||||
// используем localeCompare для корректного сравнения
|
||||
let comparison = null;
|
||||
if (numberColumns.includes(column)) {
|
||||
comparison = Number(firstCell) - Number(secondCell);
|
||||
}
|
||||
else {
|
||||
comparison = firstCell.localeCompare(secondCell);
|
||||
}
|
||||
// учитываем направление сортировки
|
||||
if (comparison !== 0) {
|
||||
return (direction ? -comparison : comparison);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
clearTable(idTable)
|
||||
//выводим отсортированную таблицу на страницу
|
||||
|
||||
let tbody = document.createElement('tbody');
|
||||
rowData.forEach(item => {
|
||||
tbody.append(item);
|
||||
});
|
||||
table.append(tbody);
|
||||
return true;
|
||||
}
|
||||
Reference in New Issue
Block a user