-1

This was my input:

  data = [
    { name: "John Cena", groupName: "WWE" },
    { name: "Nandini", groupName: null },
    { name: "Rock", groupName: "WWE" },
    { name: "Vinay", groupName: null },
    { name: "Rey Mesterio", groupName: "WWE" },
    { name: "Gokul", groupName: "FSD" },
    { name: "Rohitha", groupName: "FSD" }
  ];

I need output in to the following format:

  requiredFormat = [
    { name: "FSD", value: ["Gokul", "Rohitha"] },
    { name: "WWE", value: ["John Cena", "Rock", "Rey Mesterio"] },
    { name: null, value: ["Nandini", "Vinay"] }
  ];
sem1Colon
  • 446
  • 1
  • 4
  • 7

3 Answers3

0

You can simply reduce it and take Object.values()

var data = [ { name: "John Cena", groupName: "WWE" }, { name: "Nandini", groupName: null }, { name: "Rock", groupName: "WWE" }, { name: "Vinay", groupName: null }, { name: "Rey Mesterio", groupName: "WWE" }, { name: "Gokul", groupName: "FSD" }, { name: "Rohitha", groupName: "FSD" } ];

var result = Object.values(data.reduce((acc, {name, groupName})=>{
    acc[groupName] =acc[groupName] || {name:groupName, value:[]};
    acc[groupName].value.push(name);
    return acc;
},{}));

console.log(result);
gorak
  • 5,233
  • 1
  • 7
  • 19
0

You can do this using reduce and checking if an array value exists already. If so, add to it. If not, create it.

const data = [
  { name: "John Cena", groupName: "WWE" },
  { name: "Nandini", groupName: null },
  { name: "Rock", groupName: "WWE" },
  { name: "Vinay", groupName: null },
  { name: "Rey Mesterio", groupName: "WWE" },
  { name: "Gokul", groupName: "FSD" },
  { name: "Rohitha", groupName: "FSD" }
];

const requiredFormat = data.reduce((acc, el) => {
  const found = acc.find(({ name }) => name === el.groupName);
  if (found) found.value.push(el.name);
  else acc.push({ name: el.groupName, value: [el.name] })
  return acc;
}, []);

console.log(requiredFormat);
Nick
  • 16,066
  • 3
  • 16
  • 32
0

Use Array.reduce to solve your problem

const data = [
    { name: "John Cena", groupName: "WWE" },
    { name: "Nandini", groupName: null },
    { name: "Rock", groupName: "WWE" },
    { name: "Vinay", groupName: null },
    { name: "Rey Mesterio", groupName: "WWE" },
    { name: "Gokul", groupName: "FSD" },
    { name: "Rohitha", groupName: "FSD" }
  ];

const requiredFormat = data.reduce((acc, item, key) => {
    const group = acc.find(group => group.name === item.groupName);
    if (!group) {
        acc.push({name: item.groupName, value: [item.name]})
    } else {
        group.value.push(item.name);
    }
    return acc;
}, []);

console.log(requiredFormat);
Michael Mishin
  • 586
  • 2
  • 8