Страница 1 из 1

Примеры реализации макросов

Добавлено: 27 май 2025, 10:18
tyulegenov.nn
Получение фильтров

/**
* @fileoverview Модуль фильтрации данных. Содержит утилиты для извлечения уникальных значений (бренды, категории),
* а также вычисления статистики по ценам и датам.
*/

/**
* Объект, содержащий библиотеку фильтров.
* @namespace Common.FilterLib
*/
Common.FilterLib = {};

let uniqueBrands = [];
let uniqueCategory1 = [];
let uniqueCategory2 = [];
let uniqueCategory3 = [];
let priceLevels = {};
let dateLevels = {};


Common.FilterLib.createFilter = function(arrayData) {

let uniqueCategoryCodes = Array.from(new Set(arrayData.map(item => item.categoryCode))).sort();
let uniqueCat1 = new Set();
let uniqueCat2 = new Set();
let uniqueCat3 = new Set();

for (let i = 0; i < uniqueCategoryCodes.length; i++) {
let uniqueCategoryCode = uniqueCategoryCodes;
let categoryParts = uniqueCategoryCode.split('.');

let category1 = categoryParts[0] || "";
let category2 = categoryParts[0] && categoryParts[1] ? `${categoryParts[0]}.${categoryParts[1]}`: "";
let category3 = categoryParts[0] && categoryParts[1] && categoryParts[2] ? `${categoryParts[0]}.${categoryParts[1]}.${categoryParts[2]}`: "";

uniqueCat1.add(category1);

if (categoryParts[1] !== undefined && categoryParts[1] !== '') {
uniqueCat2.add(category2);
}

if (categoryParts[2] !== undefined && categoryParts[2] !== '') {
uniqueCat3.add(category3);
}
}

uniqueBrands = Array.from(new Set(arrayData.map(item => item.brand))).sort();
uniqueCategory1 = Array.from(uniqueCat1).sort();
uniqueCategory2 = Array.from(uniqueCat2).sort();
uniqueCategory3 = Array.from(uniqueCat3).sort();
priceLevels = findMinAvgMaxPrice(arrayData);
dateLevels = findMinMaxDate(arrayData);
}

/**
* Возвращает отфильтрованные данные в зависимости от указанного параметра.
* Например: уникальные бренды, уровни категорий, диапазоны цен или дат.
*
* @param {string} parameter - Тип запрашиваемых данных. Возможные значения:
* 'brands' — уникальные бренды,
* 'category1' — первые уровни категорий,
* 'category2' — вторые уровни категорий,
* 'category3' — третьи уровни категорий,
* 'eventDates' — минимальная и максимальная дата событий,
* 'prices' — статистика по ценам (min, avg, max).
* @returns {Array<string>|Object} Отфильтрованные данные в зависимости от параметра.
*/
Common.FilterLib.getFilter = function(parameter) {

switch (parameter) {
case 'brands':
return uniqueBrands;
case 'category1':
return uniqueCategory1;
case 'category2':
return uniqueCategory2;
case 'category3':
return uniqueCategory3;
case 'eventDates':
return dateLevels;
case 'prices':
return priceLevels;
default:
return 0;
}
}


/**
* Вычисляет минимальную, среднюю и максимальную цену из массива данных.
*
* @param {Array<Object>} arrayData - Массив объектов с данными, содержащими поле `price`.
* @returns {{minPrice: number|null, avgPrice: number|null, maxPrice: number|null}} Объект с результатами.
*/
function findMinAvgMaxPrice(arrayData) {
if (arrayData.length === 0) {
return {
minPrice: null,
maxPrice: null,
avgPrice: null
};
}

let minPrice = parseFloat(arrayData[0].price);
let maxPrice = parseFloat(arrayData[0].price);
let totalPrice = 0;

for (let i = 0; i < arrayData.length; i++) {
const price = parseFloat(arrayData.price);

// Пропускаем некорректные значения
if (isNaN(price)) continue;

totalPrice += price;
if (price < minPrice) minPrice = price;
if (price > maxPrice) maxPrice = price;
}

const avgPrice = totalPrice / arrayData.length;

return {
minPrice: parseFloat(minPrice.toFixed(2)),
maxPrice: parseFloat(maxPrice.toFixed(2)),
avgPrice: parseFloat(avgPrice.toFixed(2))
};
}


/**
* Определяет минимальную и максимальную дату события из массива данных.
*
* @param {Array<Object>} arrayData - Массив объектов с данными, содержащими поле `eventTime`.
* @returns {{minDate: Date|null, maxDate: Date|null}} Объект с минимальной и максимальной датой.
*/
function findMinMaxDate(arrayData) {
if (arrayData.length === 0) {
return {
minDate: null,
maxDate: null
};
}

let minDate = new Date(arrayData[0].eventTime);
let maxDate = new Date(arrayData[0].eventTime);

for (let i = 1; i < arrayData.length; i++) {
const currentDate = new Date(arrayData.eventTime);

// Проверяем, является ли дата корректной
if (isNaN(currentDate.getTime())) continue;

if (currentDate < minDate) {
minDate = currentDate;
}

if (currentDate > maxDate) {
maxDate = currentDate;
}
}

return {
minDate: minDate,
maxDate: maxDate
};
}