【问题标题】:How to create a nested object given an array of keys如何在给定键数组的情况下创建嵌套对象
【发布时间】:2018-10-21 13:36:00
【问题描述】:

Given 是一个这样的数组:

var level = ["a", "b", "x"];

输出应该是:

{
    "a": {
        "b": {
            "x": {
            }
        }
    }
}

我试过了:

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?
}

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

【问题讨论】:

    标签: javascript arrays object


    【解决方案1】:

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

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

    【讨论】:

    • 这是我在一段时间内看到的reduceRight 的第一个好用处。非常好!
    【解决方案2】:

    最简单的调整是在每次迭代时重新分配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);

    不过,这可能是一种更清晰的方式:

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

    【讨论】:

      【解决方案3】:

      您可以检查关卡是否存在,如果没有设置,则只分配一个对象。

      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);

      【讨论】:

        【解决方案4】:

        这个,我认为如果你用函数式的风格写它是最简单的。

        var level = ["a", "b", "x"];
        var o = {};
        level.reduce(function (obj, key) {
            o[key] = {};
            return o[key];
        }, o);
        

        【讨论】:

          【解决方案5】:

          或者使用递归函数

          const level = ["a", "b", "x"];
          const f = (i) => i === level.length ? {} : {[level[i]]: f(i+1)};
          console.log(f(0));

          【讨论】:

          • 我也喜欢这个解决方案。
          猜你喜欢
          • 1970-01-01
          • 2011-02-14
          • 1970-01-01
          • 2013-09-28
          • 1970-01-01
          • 1970-01-01
          • 2020-09-13
          • 2021-03-12
          • 2022-10-24
          相关资源
          最近更新 更多