84 lines
3.2 KiB
JavaScript
84 lines
3.2 KiB
JavaScript
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);
|
||
} |