#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 }
Комментариев нет:
Отправить комментарий