У объекта есть свойство className, которое хранит список «классов» - слов, разделенных пробелами:
var obj = {
className: 'open menu'
}
Напишите функцию removeClass(obj, cls), которая удаляет класс cls, если он есть:
removeClass(obj, 'open'); // obj.className='menu' removeClass(obj, 'blabla'); // без изменений (нет такого класса)
P.S. Дополнительное усложнение. Функция должна корректно обрабатывать дублирование класса в строке:
obj = { className: 'my menu menu' };
removeClass(obj, 'menu');
alert(obj.className); // 'my'
Лишних пробелов после функции образовываться не должно.
Решение заключается в том, чтобы разбить className в массив классов, а затем пройтись по нему циклом. Если класс есть - удаляем его splice, заново объединяем массив в строку и присваиваем объекту.
function removeClass(obj, cls) {
var classes = obj.className.split(' ');
for(i=0; i<classes.length; i++) {
if (classes[i] == cls) {
classes.splice(i, 1); // удалить класс
*!*
i--; // (*)
*/!*
}
}
obj.className = classes.join(' ');
}
var obj = { className: 'open menu menu' }
removeClass(obj, 'blabla');
removeClass(obj, 'menu')
alert(obj.className) // open
В примере выше есть тонкий момент. Элементы массива проверяются один за другим. При вызове splice удаляется текущий, i-й элемент, и те, которе после них, сдвигаются на его место.
Таким образом, на месте i оказывается новый, непроверенный элемент.
Чтобы это учесть, строчка (*) уменьшает i, чтобы следующая итерация цикла заново проверила элемент с номером i. Без нее функция будет работать с ошибками.