Где элементы находятся, что за элементы, и какой класс будем им добавлять/убирать:
const container = document.querySelector('nav');
const itemSelector = '.sidebar-item';
const activeClass = 'selected';
Вариант раз, делегируем обработку клика контейнеру. При клике ищем элемент с нужным классом, снимаем класс, устанавливаем класс кликнутому:
container.addEventListener('click', e => {
const item = e.target.closest(itemSelector);
if (item) {
const activeItem = e.currentTarget.querySelector(`.${activeClass}`);
if (activeItem) {
activeItem.classList.remove(activeClass);
}
item.classList.add(activeClass);
}
});
Вариант два, тоже с делегированием. Перебираем все элементы, переключаем класс в зависимости от того, является ли текущий элемент кликнутым:
container.addEventListener('click', function({ target: t }) {
if (t = t.closest(itemSelector)) {
for (const n of this.querySelectorAll(itemSelector)) {
n.classList.toggle(activeClass, n === t);
}
}
});
Вариант три, назначаем обработчик клика каждому элементу индивидуально, перебираем элементы аналогично предыдущему варианту:
const items = container.querySelectorAll(itemSelector);
const onClick = e => items.forEach(n => n.classList.toggle(activeClass, n === e.currentTarget));
items.forEach(n => n.addEventListener('click', onClick));
Вариант четыре, обработчик клика назначается как и в предыдущем, но, как и в первом варианте, будем убирать класс у активного элемента и добавлять кликнутому:
container.querySelectorAll(itemSelector).forEach(function(n) {
n.addEventListener('click', this);
}, function(e) {
this[0] && this[0].classList.remove(activeClass);
e.currentTarget.classList.add(activeClass);
}.bind(container.getElementsByClassName(activeClass)));