从属性数组创建动态嵌套对象

xSh*_*ase 16 javascript arrays object

这听起来像一个简单的任务,但我无法弄清楚:我有一个数组:

var array = ['opt1','sub1','subsub1','subsubsub1']
Run Code Online (Sandbox Code Playgroud)

从那我想生成以下对象:

{
  opt1:{
    sub1:{
      subsub1:{
        subsubsub1:{}
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我有办法做到这一点,制作一个字符串并使用eval,但我希望避免这种情况,任何想法?

p.s*_*w.g 28

你可以使用reduce:

var array = ['opt1','sub1','subsub1','subsubsub1'];
var object = {};
array.reduce(function(o, s) { return o[s] = {}; }, object);
console.log(object);
Run Code Online (Sandbox Code Playgroud)

但这仅在ECMAScript 5.1中引入,因此在某些旧版浏览器中不支持.如果您想要旧版浏览器支持的内容,您可以使用上面MDN文章中描述的polyfill技术,或者使用简单的for-loop,如下所示:

var array = ['opt1','sub1','subsub1','subsubsub1'];
var object = {}, o = object;
for(var i = 0; i < array.length; i++) {
    o = o[array[i]] = {};
}
console.log(object);
Run Code Online (Sandbox Code Playgroud)

  • 太棒了,正是我需要的,谢谢! (2认同)
  • 或者考虑`.reduceRight()`,以便返回值是顶级对象. (2认同)

Вад*_*лов 6

您可以使用lodash设置功能

_.set(yourObject, 'a.b.c')
Run Code Online (Sandbox Code Playgroud)


le_*_*e_m 5

您可以reduceRight用来将数组转换为对象的“链”:

const array = ['a', 'b', 'c'];
const object = array.reduceRight((obj, next) => ({[next]: obj}), {});

// Example:
console.log(object); // {"a":{"b":{"c":{}}}}
Run Code Online (Sandbox Code Playgroud)