Чтобы улучшить Ответ Нины Шольц , вы можете добавить дополнительную проверку к каждой рекурсии, чтобы индексы из-за пределов не выдавали ошибку:
function arrayToList (array) {
return array.reduceRight(
(rest, value) => ({ value, rest }),
null
);
}
function item (list, index) {
return list
? index
? item(list.rest, index - 1)
: list.value
: undefined;
}
const list = arrayToList([10, 20, 30]);
console.log(item(list, 0));
console.log(item(list, 1));
console.log(item(list, 2));
console.log(item(list, 3));
Если вы хотите также поддерживать отрицательные индексы, аналогично slice()
и splice()
, вам потребуется другая функция для получения length
списка и затем настройте функцию item
соответственно:
function arrayToList (array) {
return array.reduceRight(
(rest, value) => ({ value, rest }),
null
);
}
function length (list, index = 0) {
return list
? length(list.rest, index + 1)
: index;
}
function item (list, index) {
return list
? index
? index > 0 || (index += length(list)) > 0
? item(list.rest, index - 1)
: index < 0
? undefined
: list.value
: list.value
: undefined;
}
const list = arrayToList([10, 20, 30]);
console.log(item(list, 0));
console.log(item(list, 1));
console.log(item(list, 2));
console.log(item(list, 3));
console.log(item(list, -1));
console.log(item(list, -2));
console.log(item(list, -3));
console.log(item(list, -4));
P.S. arrayToList()
выше использует reduceRight()
для упрощения реализации. listToArray()
может использовать расширенный синтаксис и рекурсию для упрощения его реализации:
function arrayToList (array) {
return array.reduceRight(
(rest, value) => ({ value, rest }),
null
);
}
function listToArray (list, array = []) {
return list
? listToArray(list.rest, [...array, list.value])
: array;
}
const list = arrayToList([10, 20, 30]);
const array = listToArray(list);
console.log(list);
console.log(array);