Я пишу функцию для преобразования массива в список с помощью Javascript.
Если входной массив выглядит следующим образом:
let inputArray = [1,2,3]
Выходной объект должен быть таким, как показано ниже:
let outputList = {
value: 1,
rest: {
value: 2,
rest: {
value : 3,
rest: null } } }
У меня есть функция ниже, которая принимает вложенный объект в качестве параметра и возвращает строку, которая представляет, где в объекте свойство имеет значение null:
function getLastValue(object) {
let s = '';
if (object.rest) {
return s += '[rest]' + getLastValue(object.rest);
} else {
return s;
}
И функция ниже, которая преобразует массив в список:
var list = {value: '', rest: null};
function constructList(arr) {
for (let prop of arr) {
let lastValue = getLastValue(list);
`${list}${lastValue}`.value = prop;
`${list}${lastValue}`.rest = null;
}
return list;
}
Функция constructList не работает, поскольку ${list}${lastValue} является строкой. Мне нужно преобразовать приведенное выше из
'list[rest][rest]'
к
list[rest][rest]
Любая помощь приветствуется!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это было бы отличным местом для использования reduceRight - сначала создайте самый внутренний объект и пусть это будет новое значение аккумулятора, которое присваивается свойству rest следующего самого внутреннего объекта, и так далее:
const constructList = arr => arr.reduceRight(
(rest, value) => ({ value, rest }),
null
);
console.info(
constructList([1, 2, 3])
);Чтобы исправить исходный код, вместо того, чтобы создавать нить, который пытается ссылаться на вложенный объект, выполните итерацию по вложенной структуре, чтобы найти самое внутреннее свойство rest, и вернуть объект, который не содержит истинного свойства rest:
function getLastValue(obj) {
while (true) {
if (!obj.rest) return obj;
obj = obj.rest;
}
}
var list = {
value: '',
rest: null
};
function constructList(arr) {
for (let prop of arr) {
const nestedObj = getLastValue(list);
nestedObj.value = prop;
nestedObj.rest = {};
}
getLastValue(list).rest = null;
return list;
}
console.info(
constructList([1, 2, 3])
);