繁体   English   中英

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

[英]Create a dynamic nested object from array of properties

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

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

从中我想生成以下对象:

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

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

您可以使用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);

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

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

你可以使用lodash set 函数

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

您可以使用以下功能

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": {}
     }
    }
  }
}
如果这就是你的意思,请告诉我。

亲切的问候。

由于@pswg 的答案是纯 js 的一个很好的答案,但是如果您想以描述性和功能性的方式替代它并set a value for final nested prop ,则可以使用ramdajs assocPath https://ramdajs.com/ docs/#assocPath如下所示:

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

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

在此处输入图片说明

更多细节:

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

例子:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM