Выразительный JavaScript (Хавербеке) - страница 45

>// → [5, 4, 3, 2]

Обращаем вспять массив

У массивов есть метод >reverse, меняющий порядок элементов в массиве на обратный. В качестве упражнения напишите две функции, >reverseArray и >reverseArrayInPlace. Первая получает массив как аргумент и выдаёт новый массив – с обратным порядком элементов. Вторая работает как оригинальный метод >reverse – она меняет порядок элементов на обратный в том массиве, который был ей передан в качестве аргумента. Не используйте стандартный метод >reverse.

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

>console.log(reverseArray(["A", "B", "C"]));

>// → ["C", "B", "A"];

>var arrayValue = [1, 2, 3, 4, 5];

>reverseArrayInPlace(arrayValue);

>console.log(arrayValue);

>// → [5, 4, 3, 2, 1]

Список

Объекты могут быть использованы для построения различных структур данных. Часто встречающаяся структура – список (не путайте с массивом). Список – связанный набор объектов, где первый объект содержит ссылку на второй, второй – на третий, и т. п.

>var list = {

>  value: 1,

>  rest: {

>    value: 2,

>    rest: {

>      value: 3,

>      rest: null

>    }

>  }

>};

В результате объекты формируют цепочку:



Списки удобны тем, что они могут делиться частью своей структуры. Например, можно сделать два списка, >{value: 0, rest: list} и >{value: -1, rest: list}, где >list – это ссылка на ранее объявленную переменную. Это два независимых списка, при этом у них есть общая структура >list, которая включает три последних элемента каждого из них. Кроме того, оригинальный список также сохраняет свои свойства как отдельный список из трёх элементов.

Напишите функцию >arrayToList, которая строит такую структуру, получая в качестве аргумента >[1, 2, 3], а также функцию >listToArray, которая создаёт массив из списка. Также напишите вспомогательную функцию >prepend, которая получает элемент и создаёт новый список, где этот элемент добавлен спереди к первоначальному списку, и функцию >nth, которая в качестве аргументов принимает список и число, а возвращает элемент на заданной позиции в списке или же >undefined в случае отсутствия такого элемента.

Если ваша версия >nth нерекурсивна, тогда напишите её рекурсивную версию.

>console.log(arrayToList([10, 20]));

>// → {value: 10, rest: {value: 20, rest: null}}

>console.log(listToArray(arrayToList([10, 20, 30])));

>// → [10, 20, 30]

>console.log(prepend(10, prepend(20, null)));

>// → {value: 10, rest: {value: 20, rest: null}}

>console.log(nth(arrayToList([10, 20, 30]), 1));

>// → 20

Глубокое сравнение