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

时间:2014-03-21 15:21:28

标签: javascript arrays object

这听起来像一项简单的任务,但我无法弄明白:我有一个阵列:

var array = ['opt1','sub1','subsub1','subsubsub1']

由此我想生成以下对象:

{
  opt1:{
    sub1:{
      subsub1:{
        subsubsub1:{}
      }
    }
  }
}

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

5 个答案:

答案 0 :(得分:28)

您可以使用reduce



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




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



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);
&#13;
&#13;
&#13;

答案 1 :(得分:4)

您可以使用lodash设置功能

_.set(yourObject, 'a.b.c')

答案 2 :(得分:4)

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

(char *) &myArray[3][2] - (char *) &myArray[0][0]

答案 3 :(得分:0)

您可以使用以下功能

function arr2nestedObject(myArray){
 var cp_myArray = myArray;
 var lastobj = {};
 while(cp_myArray.length>0){
    newobj = {};
    var prop = cp_myArray.pop();
    newobj[prop] = lastobj;
    lastobj = newobj;
 }
 return lastobj;
}

以下代码:

var myArray = ["personal-information", "address", "street",'Great-Success'];
console.log(JSON.stringify(arr2nestedObject(myArray),undefined,2));

将产生以下输出:

{
  "personal-information": {
   "address": {
    "street": {
     "Great-Success": {}
     }
    }
  }
}
请让我知道这是否是您的意思。

亲切的问候。

答案 4 :(得分:0)

@pswg答案对于纯js来说是一个很好的答案,但是如果您想要以描述性和功能性的方式使用set a value for final nested prop的替代方法,则可以使用ramdajs assocPath {{3} },如下所示:

var array = ['opt1','sub1','subsub1','subsubsub1'];

R.assocPath(array, "the value", {}); 

https://ramdajs.com/docs/#assocPath

更多详细信息:

对对象进行浅表克隆,设置或覆盖节点 创建给定路径所需的值,并将特定值放在 该路径的末端。请注意,这将复制并展平 将原型属性也添加到新对象上。所有非原始 属性是通过引用复制的。

示例:

R.assocPath(['a', 'b', 'c'], 42, {a: {b: {c: 0}}}); //=> {a: {b: {c: 42}}}

// Any missing or non-object keys in path will be overridden
R.assocPath(['a', 'b', 'c'], 42, {a: 5}); //=> {a: {b: {c: 42}}}