Страницы

Поиск по вопросам

суббота, 1 февраля 2020 г.

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

#javascript #массивы #объекты


Есть массив:

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]]
= {};
...


    


Ответы

Ответ 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; }

Ответ 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 }

Комментариев нет:

Отправить комментарий