Рекурсивно обходите аргументы, разворачивайте массивы и собирайте строки, числа и truthy-ключи объектов.
Реализуйте функцию формирования строки CSS-классов. Она принимает произвольное количество аргументов разных типов: строки и числа добавляются в результат, массивы рекурсивно разворачиваются, из объектов берутся ключи с truthy-значениями, а невалидные значения игнорируются. Результат — строка классов, разделённых пробелами.
Рекурсивно обходите аргументы, разворачивайте массивы и собирайте строки, числа и truthy-ключи объектов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Рекурсивно обходите аргументы, разворачивайте массивы и собирайте строки, числа и truthy-ключи объектов.
В этом варианте 0 включается, NaN и бесконечности игнорируются; поддерживаются обычные объекты и массивы без циклов. Дубликаты не удаляются.
function classNames(...args) {
const result = [];
function visit(value) {
if (typeof value === 'string') {
if (value.trim()) result.push(value.trim());
} else if (typeof value === 'number') {
if (Number.isFinite(value)) result.push(String(value));
} else if (Array.isArray(value)) {
value.forEach(visit);
} else if (value && typeof value === 'object') {
const proto = Object.getPrototypeOf(value);
if (proto === Object.prototype || proto === null) {
for (const key of Object.keys(value)) {
if (value[key] && key.trim()) result.push(key.trim());
}
}
}
}
args.forEach(visit);
return result.join(' ');
}
// classNames('a', ['b', 0], { active: true, hidden: false })
// 'a b 0 active'
Для очень глубокой вложенности нужен итеративный обход, чтобы не исчерпать стек.