简体   繁体   中英

How to merge objects of an array having same property and different values using typescript?

  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"}]

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)

 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)

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM