Разбор работы функции фильтрации данных таблицы
Компании, где спрашивали:
В этом задании требуется понять, как работает представленный фрагмент кода.
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.