使用 jquery.each 循环从数组中的值创建多维 javascript 对象

Create multidimensional javascript object from values in array using jquery .each loop

我需要使用存储在数组中的值创建一个 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':{}
             }
        }
    }
}

您可以使用 reduceRight for this, with the ES6 computed property name 语法。

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 };
}, {});

您必须记住将下一个键放在哪里。因此,创建一个变量并将其初始设置为 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);

可以使用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));