Давайте напишем функцию, принимающую массив и, опционально, имя свойства, которое должно будет содержать ссылку на следующий элемент списка. Чтобы можно было делать так:
const list = arrToSinglyLinkedList(arr, 'child');
Вариант раз - перебираем массив от конца к началу, на каждом шаге создаём копию текущего элемента массива, к которой будет добавлена ссылка на объект, полученный на предыдущем шаге:
const arrToSinglyLinkedList = (arr, nextKey = 'next') =>
arr.reduceRight((acc, n) => ({ ...n, [nextKey]: acc }), null);
// или
function arrToSinglyLinkedList(arr, nextKey = 'next') {
let list = null;
for (let i = arr.length; i--;) {
const node = Object.assign({}, arr[i]);
node[nextKey] = list;
list = node;
}
return list;
}
Вариант два - рекурсия. Понадобится дополнительный параметр - индекс текущего элемента массива, если элемент с таким индексом есть, то создаём элемент списка, а в качестве следующего записываем результат рекурсивного вызова с индексом, увеличенным на единицу:
const arrToSinglyLinkedList = (arr, nextKey = 'next', i = 0) =>
i < arr.length
? Object.fromEntries([
...Object.entries(arr[i]),
[ nextKey, arrToSinglyLinkedList(arr, nextKey, -~i) ]
])
: null;
// или
function arrToSinglyLinkedList(arr, nextKey = 'next', i = 0, n = arr[i]) {
const node = n ? {} : null;
if (node) {
for (const k in n) {
if (n.hasOwnProperty(k)) {
node[k] = n[k];
}
}
node[nextKey] = arrToSinglyLinkedList(arr, nextKey, i + 1);
}
return node;
}