如何在给定一组键的情况下创建嵌套对象

pum*_*umi 22 javascript arrays object

给定是这样的数组:

var level = ["a", "b", "x"];
Run Code Online (Sandbox Code Playgroud)

输出应该是:

{
    "a": {
        "b": {
            "x": {
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过这个:

var level = ["a", "b", "x"];
var o = {};
for (var c = 0, len = level.length; c < len; c +=1 ) { 
    var part = level[c]; 
    o[part] = {}; // how to remember the last part?
}
Run Code Online (Sandbox Code Playgroud)

我怎么能记住最后一部分并添加下一个级别?

Mih*_*nut 21

您可以通过将函数作为参数传递来使用reduceRight方法.arrow

var level = ["a", "b", "x"];
let result = level.reduceRight((obj, elem) => ({[elem]: obj}), {});
console.log(result);
Run Code Online (Sandbox Code Playgroud)

  • 这是我在一段时间内为`reduceRight`看到的第一个好用途.非常好! (2认同)

Cer*_*nce 12

最简单的调整是重新分配o每次迭代:

var level = ["a", "b", "x"];
var o = {};
var initialO = o;
for (var c = 0, len = level.length; c < len; c +=1 ) { 
  var part = level[c];
  o[part] = {};
  o = o[part];
}
console.log(initialO);
Run Code Online (Sandbox Code Playgroud)

但这可能是一种更清晰的方法:

const level = ["a", "b", "x"];
const result = {};
level.reduce((accum, key) => {
  accum[key] = {};
  return accum[key];
}, result);
console.log(result);
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 6

您可以使用检查是否存在级别,如果未设置则仅分配对象.

function addLevels(levels, object) {
    levels.reduce((o, l) => o[l] = o[l] || {}, object);
}

var object = {};

addLevels(["a", "b", "x"], object);
addLevels(["a", "d", "z"], object);

console.log(object);
Run Code Online (Sandbox Code Playgroud)