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

Рекурсия выставляет visible листьям SonItem по совпадению code/name и сохраняет родителей с видимыми детьми. Но внешняя useSomDbFilterTableData ничего не возвращает: filterTableData недоступна вызывающему.

Короткий ответ

Что ответить на собеседовании

Рекурсия выставляет visible листьям SonItem по совпадению code/name и сохраняет родителей с видимыми детьми. Но внешняя useSomDbFilterTableData ничего не возвращает: filterTableData недоступна вызывающему.

Подробный разбор

Ответ с пояснениями

Условие

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

 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.

Ответ

Рекурсия выставляет visible листьям SonItem по совпадению code/name и сохраняет родителей с видимыми детьми. Но внешняя useSomDbFilterTableData ничего не возвращает: filterTableData недоступна вызывающему.

Добавьте return filterTableData в конец внешней функции либо верните объект с этим методом. Описание в условии верно лишь для внутреннего вызова, который сейчас наружу не предоставлен.

Нормализуйте searchValue один раз до обхода. Надёжность изоляции исходных данных зависит от copyObj: при поверхностной копии вложенные строки могут мутироваться. Узел SonItem с _children попадает только в первую ветку, а не рекурсивную; пустая группа скрывается, не-SonItem без детей остаётся видимым. Также нужны гарантия массива _children и отсутствие циклов.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее