Faaaah (copy to edit)
This commit is contained in:
84
lab1/JavaScript/filter.js
Normal file
84
lab1/JavaScript/filter.js
Normal file
@@ -0,0 +1,84 @@
|
||||
const correspond = {
|
||||
"Название": "structure",
|
||||
"Тип": "category",
|
||||
"Страна": "country",
|
||||
"Город": "city",
|
||||
"Год": ["yearFrom", "yearTo"],
|
||||
"Высота": ["heightFrom", "heightTo"]
|
||||
}
|
||||
|
||||
|
||||
/* Структура возвращаемого ассоциативного массива:
|
||||
{
|
||||
input_id: input_value,
|
||||
...
|
||||
}
|
||||
*/
|
||||
const dataFilter = (dataForm) => {
|
||||
let dictFilter = {};
|
||||
|
||||
// перебираем все элементы формы с фильтрами
|
||||
for (const item of dataForm.elements) {
|
||||
|
||||
// получаем значение элемента
|
||||
let valInput = item.value;
|
||||
|
||||
// если поле типа text - приводим его значение к нижнему регистру
|
||||
if (item.type === "text") {
|
||||
valInput = valInput.toLowerCase();
|
||||
}
|
||||
|
||||
if (item.type === "number"){
|
||||
if (valInput.value === ""){
|
||||
if(valInput.name.includes("From")){
|
||||
valInput = -Infinity;
|
||||
}
|
||||
else{
|
||||
valInput = Infinity;
|
||||
}
|
||||
}
|
||||
valInput = Number(valInput);
|
||||
}
|
||||
// формируем очередной элемент ассоциативного массива
|
||||
dictFilter[item.id] = valInput;
|
||||
}
|
||||
return dictFilter;
|
||||
}
|
||||
|
||||
|
||||
// фильтрация таблицы
|
||||
const filterTable = (data, idTable, dataForm) =>{
|
||||
|
||||
// получаем данные из полей формы
|
||||
const datafilter = dataFilter(dataForm);
|
||||
|
||||
// выбираем данные соответствующие фильтру и формируем таблицу из них
|
||||
let tableFilter = data.filter(item => {
|
||||
|
||||
/* в этой переменной будут "накапливаться" результаты сравнения данных
|
||||
с параметрами фильтра */
|
||||
let result = true;
|
||||
|
||||
// строка соответствует фильтру, если сравнение всех значения из input
|
||||
// со значением ячейки очередной строки - истина
|
||||
Object.entries(item).map(([key, val]) => {
|
||||
|
||||
// текстовые поля проверяем на вхождение
|
||||
if (typeof val == 'string') {
|
||||
result &&= val.toLowerCase().includes(datafilter[correspond[key]])
|
||||
}
|
||||
|
||||
if (typeof val == 'number') {
|
||||
result &&= datafilter[correspond[key]+"From"]<=Number(val)&& datafilter[correspond[key]+"To"]>=Number(val)
|
||||
}
|
||||
// САМОСТОЯТЕЛЬНО проверить числовые поля на принадлежность интервалу
|
||||
});
|
||||
|
||||
return result;
|
||||
});
|
||||
|
||||
// САМОСТОЯТЕЛЬНО вызвать функцию, которая удаляет все строки таблицы с id=idTable
|
||||
clearTable();
|
||||
// показать на странице таблицу с отфильтрованными строками
|
||||
createTable(tableFilter, idTable);
|
||||
}
|
||||
Reference in New Issue
Block a user