简体   繁体   English

将数组转换为嵌套对象

[英]Convert arrays to nested objects javascript

I have a array of objects, like this: 我有一个对象数组,像这样:

var tryArray = [{
  name: 'name1',
  subname: 'subname1',
  symbolname: 'symbol1'
},
{
  name: 'name1',
  subname: 'subname11',
  symbolname: 'symbol11'
},
{
  name: 'name2',
  subname: 'subname2',
  symbolname: 'symbol2'
},
{
  name: 'name2',
  subname: 'subname22',
  symbolname: 'symbol22'
},
{
  name: 'name3',
  subname: 'subname3',
  symbolname: 'symbol3'
},
{
  name: 'name3',
  subname: 'subname33',
  symbolname: 'symbol33'
}];

I want to convert this array into a nested object, where the name will be parent of subname, and subname will be parent of symbolname. 我想将此数组转换为一个嵌套对象,其中名称将是subname的父级,subname将是symbolname的父级。 For example: 例如:

result = {
  name1: {
    subname1: [symbolname1],
    subname11: [symbolname11] 
  },
  name2: {
    subname2: [symbolname2],
    subname22: [symbolname22] 
  },
  name3: {
    subname3: [symbolname3],
    subname33: [symbolname33] 
  }
}

I have tried using reduce like this 我已经尝试过使用reduce这样的

tryArray.reduce((object, item) => {
   object[item.name] = {[item.subname]: [item.symbolname]}
},{})

but it returned only one subname. 但它仅返回一个子名称。 any ideas how to resolved this, thank you so much 任何想法如何解决这个问题,非常感谢

reduce expects a return value like: reduce期望的返回值,例如:

 var tryArray = [{"name":"name1","subname":"subname1","symbolname":"symbol1"},{"name":"name1","subname":"subname11","symbolname":"symbol11"},{"name":"name2","subname":"subname2","symbolname":"symbol2"},{"name":"name2","subname":"subname22","symbolname":"symbol22"},{"name":"name3","subname":"subname3","symbolname":"symbol3"},{"name":"name3","subname":"subname33","symbolname":"symbol33"}] var result = tryArray.reduce((object, item) => { object[item.name] = object[item.name] || {}; //Need to init name if not exst object[item.name][item.subname] = [item.symbolname]; return object; }, {}) console.log( result ); 


If you have multiple symbolname s in a subname , you can: 如果subname有多个symbolname ,则可以:

 var tryArray = [{"name":"name1","subname":"subname1","symbolname":"symbol1"},{"name":"name1","subname":"subname11","symbolname":"symbol11"},{"name":"name2","subname":"subname2","symbolname":"symbol2"},{"name":"name2","subname":"subname22","symbolname":"symbol22"},{"name":"name3","subname":"subname3","symbolname":"symbol3"},{"name":"name3","subname":"subname33","symbolname":"symbol33"}]; var result = tryArray.reduce((object, item) => { object[item.name] = object[item.name] || {}; //Need to init name if not exist object[item.name][item.subname] = object[item.name][item.subname] || []; //Need to subname name if not exist object[item.name][item.subname].push(item.symbolname); //Push the symbolname return object; }, {}); console.log(result); 

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

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