arrayToList - а точно список должен формироваться в обратном порядке? Если да, то почему listToArray формирует в прямом?
listToArray(arrayToList([1, 2, 3])); // Array(3) [ 3, 2, 1 ]
Функция prepend работает неправильно, переворачивая исходный список.
const list = {
value: 2,
rest: {
value: 3,
rest: null,
},
};
prepend(1, list);
/*
Object {
value: 1,
rest: Object {
value: 3,
rest: Object {
value: 2,
rest: null
}
}
}
*/
Рекурсивные варианты
const arrayToList = (arr, idx = 0) => ({
value: arr[idx],
rest: idx === arr.length - 1
? null
: arrayToList(arr, idx + 1)
});
const listToArray = (list) => (
list.rest === null
? [list.value]
: [list.value, ...listToArray(list.rest)]
);
const prepend = (value, rest) => ({ value, rest });
const nth = (list, idx) => (
idx === 0
? list.value
: (
list.rest === null
? undefined
: nth(list.rest, idx - 1)
)
);
Нерекурсивные варианты
const arrayToList = (arr) => {
const list = null;
for (let i = arr.length - 1; idx >= 0; idx -= 1) {
list = { value: arr[idx], rest: list };
}
return list;
};
const listToArray = (list) => {
const arr = [];
while (list !== null) {
arr.push(list.value);
list = list.rest;
}
return arr;
};
const prepend = (value, rest) => ({ value, rest });
const nth = (list, idx) => {
while (list !== null) {
if (idx === 0) {
return list.value;
}
idx -= 1;
list = list.rest;
}
};