2

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

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

2
  • thank you vijay, but map is always return array value, but i need object as a returned value Commented Nov 28, 2018 at 9:53
  • you have to return the object object[item.name] = {[item.subname]: item.symbolname};return object; and don't wrap item.symbolname in blocks [] Commented Nov 28, 2018 at 9:57

1 Answer 1

4

reduce expects a return value like:

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 symbolnames in a subname, you can:

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);

Sign up to request clarification or add additional context in comments.

1 Comment

can you please help me what if there are multiple symbolnames for 1 subname and i want to make it as an array of symbolnames

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.