将数组转换为嵌套对象

8
假设我有以下数组: ['product', 'model', 'version']
我希望得到一个对象,如下所示:
{
    product: { 
        model: { 
            version: { 

            }
        }
     }
}

然而,该数组是动态的,因此它可能会有2、3或更少的项。最有效的方法是如何实现的?

谢谢


你是否只需要创建这个空对象?或者你需要将这些键合并到一个已经包含其他键的现有对象中? - deceze
现在它可以是任何值,因为我已经可以访问到需要添加到此对象的数据,但它必须在此结构内。谢谢。 - gugateider
3个回答

15

只需将其反转,然后逐步将内部对象包装到外部对象中:

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 - Cody G
1
并非总是如此。自 ES2016 以来,计算属性名已经存在。 - deceze
3
请注意,keys.reverse将更改原始的数组(详见文档)。建议使用keys.reduceRight代替,可能更为可取。 - Charles Wood
如果你希望对象树的最终“叶节点”包含一个值而不是空对象,你可以使用三元运算符keys.reduceRight((res, key, i) => (i === keys.length - 1 ? {[key]: myValue} : {[key]: res}) , {}); - devaent

8

您还可以使用Array.prototype.reduceRight来实现:

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

console.log(result);


2
如果我正确理解了请求,这段代码可能会做你需要的事情:
function convert(namesArray) {
  let result = {};
  let nestedObj = result;
  namesArray.forEach(name => {
    nestedObj[name] = {};
    nestedObj = nestedObj[name];
  });

  return result;
}


console.log(convert(['a', 'b', 'c']));

一切都按照预期发生了!谢谢你的帮助! - gugateider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接