Как перевести массив в многоуровневый объект (javascript)

109
05 мая 2021, 21:10

Есть массив:

var authority = [
    "Дзержинським",
    "РВ",
    "у",
    "місті",
    "Харкові",
    "ГУ",
    "ДМС",
    "України",
    "в",
    "Харківській",
    "області"
]

Необходимо на его основе получить многоуровневый объект вида:

var obj = {
    "Дзержинським": {
        "РВ": {
            "у": {
                "місті": {
                    "Харкові": {
                        "ГУ": {
                            "ДМС": {
                                "України": {
                                    "в": {
                                        "Харківській": {
                                            "області": {
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
};

Массив может быть разной длины, следовательно объект может иметь больший/меньший уровень вложенностей.

Подскажите пожалуйста, как это сделать при помощи цикла? Или возможно есть более правильное решение данной задачи?

Кроме такого больше ничего в голову не приходит :(

var tempObj = {};
tempObj[authority[0]] = {};
tempObj[authority[0]][authority[1]] = {};
tempObj[authority[0]][authority[1]][authority[2]] = {};
tempObj[authority[0]][authority[1]][authority[2]][authority[3]] = {};
tempObj[authority[0]][authority[1]][authority[2]][authority[3]][authority[4]] = {};
tempObj[authority[0]][authority[1]][authority[2]][authority[3]][authority[4]][authority[5]] = {};
...
Answer 1

Вам поможет reduceRight, заворачиваем каждую итерацию аккумулятор в свойство нового объекта под именем элемента массива.

var authority = [ "Дзержинським","РВ","у","місті","Харкові", "ГУ", "ДМС","України","в","Харківській","області"]; 
let result = authority.reduceRight((acc, el) => ({[el]: acc}), {}); 
console.log(result);
—-

upd

сокращенная форма записи лямбды в сниппете эквивалентна функции reduceRight :

authority.reduceRight(reduceFunc, {});
function reduceFunc(accumulator, element) {
     var newAccumulator = {};
     newAccumulator[element] = accumulator;
     return newAccumulator;
}
Answer 2

var a = ["Дзержинським", "РВ", "у", "місті", "Харкові", "ГУ", "ДМС", "України", "в", "Харківській", "області"] 
 
var res = {}, x = res 
for (var key of a) x = x[key] = {} 
console.log(res)
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

READ ALSO
Нужна помощь с JavaScript. Не понимаю объектов. ООП

Нужна помощь с JavaScript. Не понимаю объектов. ООП

Изучаю JavaScript (Чистый)Есть следующий код, описывающий класс PersonFactory, а так же есть конструктор:

105
Как написать JOIN?

Как написать JOIN?

Подскажите пожалуйста как решить следующую задачуЯ хочу отобразить список всех пользователей, при этом напротив тех пользователей на которых...

90
Почему не работает тест?

Почему не работает тест?

При нажатии на кнопку "Ответ" в данном тесте: 1) проверяется соответствие radiochecked

120