-1

I am trying to group an array of objects like the below using JavaScript.

const array = [
  { 'red':  50 , 'green':99 , 'blue': 66},
  {'blue':65, 'red': 88 }, 
  { 'green':9 , 'blue': 6},
  { 'red':  650 , 'green':959 , 'blue': 663},
];

and expecting the below result,

{
    red: [50, 88, 650],
    green: [99,9,959],
    blue: [66,65, 6, 663]
}

Can we implement this using Reduce function?

Thanks in advance!.

Nithya
  • 31
  • 1
  • 8
  • 3
    Can you please share your attempt to solve this? – Raghav Garg Mar 30 '22 at 13:12
  • Excuse me if this isn't the case, but your question reads as though you're a student looking for help with an assignment. There's no rule against this, but there are [suggestions](https://meta.stackoverflow.com/a/334823/11751077) that might help you get the sort of response you're looking for. – backtick Mar 30 '22 at 20:27

4 Answers4

1

You can try the below approach to do so. Hope it helps

Loop through the array and it's items. If the key already exists inside the outputObj object push the new value into the respective array, else simply create a new array with that key and value (outputObj[key] = [item[key]]).

Working code:

const array = [{
    'red': 50,
    'green': 99,
    'blue': 66
  },
  {
    'blue': 65,
    'red': 88
  },
  {
    'green': 9,
    'blue': 6
  },
  {
    'red': 650,
    'green': 959,
    'blue': 663
  },
];

//Method 1
const outputObj = {};

array.forEach(item => {
  Object.keys(item).forEach(key => {
    if (key in outputObj) {
      outputObj[key].push(item[key])
    } else {
      outputObj[key] = [item[key]]
    }
  })
})

console.log(outputObj)

//Method 2
const finalObj = array.reduce((acc, curr) => {
  const obj = Object.keys(acc).length ? acc : {}
  Object.keys(curr).forEach(key => {
    if (key in obj) {
      obj[key].push(curr[key])
    } else {
      obj[key] = [curr[key]]
    }
  })
  return obj;
}, {})

console.log(finalObj)
Ankit Saxena
  • 1,067
  • 1
  • 4
  • 16
1

  array = [
    { red: 50, green: 99, blue: 66 },
    { blue: 65, red: 88 },
    { green: 9, blue: 6 },
    { red: 650, green: 959, blue: 663 },
  ];
  
  let result = {};
    for (let item of this.array) {
      for (const [key, value] of Object.entries(item)) {
        if (!result.hasOwnProperty(key)) {
          result[key] = [value];
        } else {
          result[key].push(value);
        }
      }
    }
    
    console.log(result);
Joosep Parts
  • 5,372
  • 2
  • 8
  • 33
0

This piece of code will fill the result object grouping values coming from the same key in the array variable:

var result = {};

array.forEach(
  item => Object.keys(item).forEach(
        key => {
            if (result[key] === undefined) result[key] = [];
            result[key].push(item[key]);
        }
  )
)
Diego D
  • 6,156
  • 2
  • 17
  • 30
0
const array = [
  { 'red':  50 , 'green':99 , 'blue': 66},
  {'blue':65, 'red': 88 }, 
  { 'green':9 , 'blue': 6},
  { 'red':  650 , 'green':959 , 'blue': 663},
];

function group(array, result = {}) {
  array.forEach(object => {
    Object.keys(object).forEach(key => {
      if(!result[key]) {
        result[key] = [object[key]];
        return;
      }

      result[key].push(object[key]);
    });
  });

  return result;
}

const result = group(array);

console.log(result);
Neyaz Ahmad
  • 154
  • 3