【问题标题】:Convert array into nested object将数组转换为嵌套对象
【发布时间】:2018-08-29 12:10:57
【问题描述】:

假设我有以下数组: ['产品' , '型号' , '版本']

我想要一个对象,例如:

{
    product: { 
        model: { 
            version: { 

            }
        }
     }
}

但是,该数组是动态的,因此它可以包含 2、3 或更少的项目。 如何以最有效的方式实现这一目标?

谢谢

【问题讨论】:

  • 您是否需要只创建这个空对象?或者您是否需要将这些键合并到还包含其他键的现有对象中?
  • 现在可以是值中的任何内容,因为我可以访问需要添加到此对象的数据,但它必须位于此结构中。 Tks

标签: javascript arrays ecmascript-6 babeljs


【解决方案1】:

只要把它翻过来,依次将一个内部对象包裹成一个外部对象:

const keys = ['product', 'model', 'version'];
const result = keys.reverse().reduce((res, key) => ({[key]: res}), {});
//                                   innermost value to start with ^^

console.log(result);

【讨论】:

  • {[key]: res} --- 这一直是一回事吗? [key]:value ?
  • 并非总是如此。从 ES2016 左右开始就存在计算密钥。
  • 请记住keys.reverse will mutate the original array。使用keys.reduceRight (as suggested below) 可能更好。
【解决方案2】:

您也可以使用Array.prototype.reduceRight

const result = ['product','model','version'].reduceRight((all, item) => ({[item]: all}), {});

console.log(result);

【讨论】:

    【解决方案3】:

    如果我正确理解请求,此代码可能会满足您的需求:

    function convert(namesArray) {
      let result = {};
      let nestedObj = result;
      namesArray.forEach(name => {
        nestedObj[name] = {};
        nestedObj = nestedObj[name];
      });
    
      return result;
    }
    
    
    console.log(convert(['a', 'b', 'c']));
    

    【讨论】:

    • 按预期工作!谢谢你的帮助!!
    猜你喜欢
    • 2015-03-26
    • 2019-01-31
    • 1970-01-01
    相关资源
    最近更新 更多