Назад к задачам
Junior — Senior
6

Разбор работы функции фильтрации данных таблицы

Компании, где спрашивали:

Главгосэкспертиза
Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

В этом задании требуется понять, как работает представленный фрагмент кода.

 import { copyObj } from "core/iterable_utils";

export const useSomDbFilterTableData = (tableData) => {
    const filterTableData = (searchValue) => {
        const newTableData = copyObj(tableData).map((row) => {
            const filterRow = (row) => {
                row.visible = true;
                if (row.model_name === "SonItem") {
                    if (
                        !String(row.code).toLowerCase().includes(searchValue.toLowerCase()) &&
                        !String(row.name).toLowerCase().includes(searchValue.toLowerCase())
                    ) {
                        row.visible = false;
                    }
                } else if ("_children" in row) {
                    const children = row._children;
                    children.forEach((childRow) => {
                        filterRow(childRow);
                    });
                    if (!children.some((childRow) => childRow.visible)) {
                        row.visible = false;
                    }
                }
            };
            filterRow(row);
            return row;
        });

        return newTableData;
    };
};

Код экспортирует функцию useSomDbFilterTableData, принимающую исходный массив tableData. Внутри определяется вспомогательная функция filterRow, которая рекурсивно проходит по каждому элементу и его потомкам (если есть свойство _children). Для строк типа SonItem проверяется, содержат ли поля code или name подстроку searchValue (без учёта регистра). Если ни одно из полей не содержит искомую строку, свойство visible у строки ставится в false. Для узлов с дочерними элементами функция сначала обрабатывает всех детей, а затем, если ни один из детей не помечен как видимый, скрывает и родительский элемент. После обработки всех строк возвращается новый массив newTableData с обновлёнными флагами visible.