renovations

This commit is contained in:
Ilya Kantor 2015-01-11 01:54:57 +03:00
parent 4b8b168fd2
commit c7d4c7e3ff
172 changed files with 869 additions and 244 deletions

View file

@ -0,0 +1,11 @@
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(' ');
}

View file

@ -0,0 +1,35 @@
describe("removeClass", function() {
it("ничего не делает, если класса нет", function() {
var obj = { className: 'open menu' };
removeClass(obj, 'new');
assert.deepEqual(obj, {
className: 'open menu'
});
});
it("не меняет пустое свойство", function() {
var obj = { className: '' };
removeClass(obj, 'new');
assert.deepEqual(obj, {
className: ""
});
});
it("удаляет класс, не оставляя лишних пробелов", function() {
var obj = { className: 'open menu' };
removeClass(obj, 'open');
assert.deepEqual(obj, {
className: "menu"
});
});
it("если класс один и он удалён, то результат - пустая строка", function() {
var obj = { className: "menu" };
removeClass(obj, 'menu');
assert.deepEqual(obj, {
className: ""
});
});
});

View file

@ -0,0 +1,31 @@
Решение заключается в том, чтобы разбить `className` в массив классов, а затем пройтись по нему циклом. Если класс есть - удаляем его `splice`, заново объединяем массив в строку и присваиваем объекту.
```js
//+ run
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`. Без нее функция будет работать с ошибками.

View file

@ -0,0 +1,28 @@
# Функция removeClass
[importance 5]
У объекта есть свойство `className`, которое хранит список "классов" - слов, разделенных пробелами:
```js
var obj = {
className: 'open menu'
};
```
Напишите функцию `removeClass(obj, cls)`, которая удаляет класс `cls`, если он есть:
```js
removeClass(obj, 'open'); // obj.className='menu'
removeClass(obj, 'blabla'); // без изменений (нет такого класса)
```
P.S. Дополнительное усложнение. Функция должна корректно обрабатывать дублирование класса в строке:
```js
obj = { className: 'my menu menu' };
removeClass(obj, 'menu');
alert(obj.className); // 'my'
```
Лишних пробелов после функции образовываться не должно.