Реализуйте одну или обе функции в приложении: пользователь может закреплять и откреплять сайты иконкой в списке; закреплённые сайты должны отображаться вверху списка. Вторую функцию можно выбрать по своему усмотрению.

Храните признак закрепления по стабильному ID сайта и сортируйте закреплённые элементы перед остальными. Переключение должно обновлять состояние, не изменяя исходный массив напрямую.

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

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

Храните признак закрепления по стабильному ID сайта и сортируйте закреплённые элементы перед остальными. Переключение должно обновлять состояние, не изменяя исходный массив напрямую.

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

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

Храните признак закрепления по стабильному ID сайта и сортируйте закреплённые элементы перед остальными. Переключение должно обновлять состояние, не изменяя исходный массив напрямую.

Пример преобразований без привязки к UI:

function togglePin(sites, id) {
  return sites.map(site => site.id === id
    ? { ...site, pinned: !site.pinned } : site);
}
function orderedSites(sites) {
  return sites.map((site, index) => ({ site, index }))
    .sort((a, b) => Number(b.site.pinned) - Number(a.site.pinned)
      || a.index - b.index)
    .map(entry => entry.site);
}

Иконке нужны доступное имя и aria-pressed. Для сохранения между входами используйте серверные настройки, для локального прототипа — localStorage. Вторую функцию условие разрешает не реализовывать.

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

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

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

Подробнее