Преобразование массивов во вложенные объекты JavaScript

У меня есть массив объектов, например:

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'
}];

Я хочу преобразовать этот массив во вложенный объект, где имя будет родительским для subname, а subname будет родительским для symbolname. Например:

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

Я пытался использовать уменьшить, как это

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

но он вернул только одно имя. любые идеи, как решить эту проблему, большое спасибо

1 ответ

Решение

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


Если у вас есть несколько symbolname в subname, вы можете:

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

Другие вопросы по тегам