Осторожно! Эта задача требует умения работать с массивами для понимания реализации функции l()
(чтобы принять любое число аргументов). Если вы их не знаете, лучше вернуться к этой задаче после прохождения курса "JS: Коллекции".
Необходимо реализовать набор функций для работы со списками.
Подразумевается, что интерфейс работы этой абстракции абсолютно точно такой же, как и тот, что использовался в курсе. Другими словами, можно безболезненно переписать реализацию тех функций, которые делались в курсе, и весь код, использующий списки, будет работать как ни в чем не бывало.
list.js
Реализуйте и экспортируйте следующие функции:
l(...items)
— функция-конструктор. Уже реализована.toString(list)
— возвращает строковое представление спискаhead(list)
— возвращает первый элемент спискаtail(list)
— возвращает "хвост" списка (все элементы, кроме первого)isEmpty(list)
— проверяет, является ли список пустымcons(item, list)
— добавляет элемент в начало списка и возвращает новый списокfilter(predicate, list)
— фильтрует список, используя предикатmap(callback, list)
— преобразует список, используя callback-функциюreduce(callback, init, list)
— производит свертывание списка
Примеры:
const list = l('foo', 'bar', 'baz');
toString(list); // (foo, bar, baz)
const first = head(list); // 'foo'
const rest = tail(list); // l('bar', 'baz')
console.log(isEmpty(list)); //=> false
console.log(isEmpty(l())); //=> true
const newList = cons('bas', list); // l('bas', 'foo', 'bar', 'baz')
const filteredList = filter(item => item[0] === 'b', list); // l('bar', 'baz')
const mappedList = map(item => item[0], list); // l('f', 'b', 'b')
const reducedList = reduce((item, acc) => acc ? `${acc},${item}` : item, '', list);
console.log(reducedList); //=> foo,bar,baz
Подсказки
- Решение учителя на 100% функциональное
- Длина строки
str
находится так:str.length
Чтобы получить подстроку из строки, используйте метод
substr()
:'foo'.substr(1, 2); // 'oo';
Чтобы получить индекс, по которому находится отдельный символ в строке, используйте метод
indexOf()
'bar'.indexOf('a'); // 1;
Для полного доступа к испытанию нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Отзывы

Очень интересное задание, спасибо! Некоторые функции получились чуть длиннее, чем в решении учителя, но мне мое решение тоже нравится :)

Классное задание. Сначала не понимал всю силу функций высшего порядка, но после этого задания осенило. Моё решение: https://ru.hexlet.io/code_reviews/12062 Имеет право на жизнь?

Было полезно еще раз на примере увидеть, что функции высшего порядка уже внутри на другом уровне абстракции и не зависят от конкретной реализации списка.