-3
  interface IData{
  cabinTo:string[];
  cabinFrom:string;
  }

  const dataAfterIteration=
   [{cabinTo:"A",cabinFrom:"B"},
    {cabinTo:"A",cabinFrom:"C"}, 
    {cabinTo:"B",cabinFrom:"C"}, 
    {cabinTo:"C",cabinFrom:"A"}]

    let dataToPost: Array<IData>=[];

Need to push the data to dataToPost in such a way that for same cabinFrom value all the cabinTo value will be merged.

Answer should be

dataToPost =[{cabinTo:["A"],cabinFrom:"B"},{cabinTo:["A,B"],cabinFrom:"C"},{cabinTo:["C"],cabinFrom:"A"}]
Tushar Gupta
  • 15,504
  • 1
  • 29
  • 47
  • this might help: https://stackoverflow.com/questions/14446511/most-efficient-method-to-groupby-on-an-array-of-objects – Nsevens Aug 19 '22 at 09:00

3 Answers3

0

I think what you want is

const dataAfterIteration = [{
    cabinTo: "A",
    cabinFrom: "B"
  },
  {
    cabinTo: "A",
    cabinFrom: "C"
  },
  {
    cabinTo: "B",
    cabinFrom: "C"
  },
  {
    cabinTo: "C",
    cabinFrom: "A"
  }
]


let cabinFromToHash = {}
for (const data of dataAfterIteration) {
  if (!Array.isArray(cabinFromToHash[data.cabinFrom])) {
    cabinFromToHash[data.cabinFrom] = []
  }
  cabinFromToHash[data.cabinFrom].push(data.cabinTo)
}


const format = Object.keys(cabinFromToHash).map(item => {
    return { cabinFrom: item, cabinTo: cabinFromToHash[item] }
})

console.log(format)
Rajesh Paudel
  • 1,117
  • 8
  • 19
0

var dataAfterIteration = [{
    cabinTo: "A",
    cabinFrom: "B"
  },
  {
    cabinTo: "A",
    cabinFrom: "C"
  },
  {
    cabinTo: "B",
    cabinFrom: "C"
  },
  {
    cabinTo: "C",
    cabinFrom: "A"
  }
];

var groupBy = function(xs, key) {
  return xs.reduce(function(rv, x) {
    (rv[x[key]] = rv[x[key]] || []).push(x);
    return rv;
  }, {});
};

var groupedItems = groupBy(dataAfterIteration, "cabinFrom");
var dataToPost = Object.keys(groupedItems).map(it => ({
  cabinFrom: it,
  cabinTo: groupedItems[it].map(r => r.cabinTo)
}));

console.log(dataToPost)
Nsevens
  • 2,588
  • 1
  • 17
  • 34
0

try this

function mergeData(data: { cabinTo: string; cabinFrom: string }[]): IData[] {
    const dataToPost = new Map<string, string[]>();
    for (const { cabinTo, cabinFrom } of data) {
        if (!dataToPost.has(cabinFrom)) dataToPost.set(cabinFrom, []);
        dataToPost.get(cabinFrom)?.push(cabinTo);
    }
    return Array.from(dataToPost.entries()).map(([cabinFrom, cabinTo]) => ({ cabinTo, cabinFrom }));
}

const dataToPost = mergeData(dataAfterIteration)
Dylan Dang
  • 156
  • 4