Реализуйте функцию формирования строки CSS-классов. Она принимает произвольное количество аргументов разных типов: строки и числа добавляются в результат, массивы рекурсивно разворачиваются, из объектов берутся ключи с truthy-значениями, а невалидные значения игнорируются. Результат — строка классов, разделённых пробелами.

Рекурсивно обходите аргументы, разворачивайте массивы и собирайте строки, числа и 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'

Для очень глубокой вложенности нужен итеративный обход, чтобы не исчерпать стек.

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

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

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

Подробнее