Создать многомерный объект javascript из значений в массиве, используя цикл jquery .each
Мне нужно создать объект JavaScript, используя значения, хранящиеся в массиве. Каждое значение должно быть новым ключом внутри предыдущего. Каков наилучший подход для достижения этой цели?
var option = ['level_1','level_2','level_3','level_4'];
$.each( option, function( key, value ) {
// ....
});
// I'm trying to get this result
var result = {
'level_1': {
'level_2': {
'level_3': {
'level_4':{}
}
}
}
}
4 ответа
Решение
Вы должны отслеживать, где поставить следующий ключ. Итак, создайте переменную и изначально установите ее result
затем на каждом проходе по массиву перемещайтесь туда, куда указывает эта переменная.
var option = ['level_1','level_2','level_3','level_4'];
var result = {};
var nextKeyGoesHere = result;
option.forEach( function( value ) {
nextKeyGoesHere[value] = {};
nextKeyGoesHere = nextKeyGoesHere[value];
});
console.log(result);
Ты можешь использовать reduceRight
для этого используется синтаксис имени вычисляемого свойства ES6.
const option = ['level_1','level_2','level_3','level_4'];
const obj = option.reduceRight( (acc, lvl) => ({ [lvl]: acc }), {});
console.log(obj);
В традиционном синтаксисе функции это будет:
const obj = option.reduceRight(function (acc, lvl) {
return { [lvl]: acc };
}, {});
Можешь использовать Array#reduce()
var option = ['level_1','level_2','level_3','level_4'];
var res = {};
option.reduce((o, key) => (o[key] = {} , o[key]), res)
console.log(res)
Вы можете использовать любой из других ответов, которые используют Array#reduce
Однако, если вы хотите рекурсивную версию, вот она:
function _makeTree(arr, index, subtree){
if(index < arr.length){
subtree[arr[index]] = {};
return _makeTree(arr, index+1, subtree[arr[index]])
}
else return;
}
function makeTree(arr){
var tree = {};
_makeTree(arr, 0, tree)
return tree;
}
var arr = ['level_1','level_2','level_3','level_4'];
console.log(makeTree(arr));