Javascript: Списки на базе строк

JS: Последовательности 64 сообщения
Обновлено: 04 мая, 12:37
915
Студентов
67%
Завершения

Осторожно! Эта задача требует умения работать с массивами для понимания реализации функции 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;
    

Для полного доступа к испытанию нужен базовый план

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

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Впечатления

Аватар пользователя Julia Stetskaya
Julia Stetskaya 03 октября 2017

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


Аватар пользователя Ivan Trofimov
Ivan Trofimov 20 марта 2017

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


Аватар пользователя Илья Кузнецов
Илья Кузнецов 15 февраля 2017

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