Search code examples
mergerefactoringassignspread-syntax

Javascript: Refactor array of objects without overwriting keys


I have an array of objects that I'd like to refactor (make a different structure)..

Existing Array:

[ 0: { category: 100 },
  1: { category: 101 },
  2: { category: 102 },
  3: { tag: 200 },
  4: { tag: 201 },
  5: { tag: 202 },
  6: { year: 300 },
  7: { year: 301 },
  8: { year: 302 } 
]

Want Array:

[ 0: { category: [ 100, 101, 102 ] },
  1: { tag: [ 200, 201, 202 ] },
  2: { year: [ 300, 301, 302 ] } 
]

Any help is greatly appreciated. ES6 syntax welcome.


Solution

  • Use Array.prototype.reduce

    let input = [{ category: 100 },
    { category: 101 },
    { category: 102 },
    { tag: 200 },
    { tag: 201 },
    { tag: 202 },
    { year: 300 },
    { year: 301 },
    { year: 302 } 
    ];
    
    let output = input.reduce((acc, curr) => {
      let key = Object.keys(curr)[0];
      acc[key] = acc[key] ? [curr[key], ...acc[key]] : [curr[key]];
      return acc;
    }, {});
    console.log(output)