0

I have a requirement of displaying an array of data obtained from firebase.The data consisits of date and values.The array is as below

[{data:
{paidAmount: 850, purpose: "Medicine"}
date:
21/02/2018},
{data:
{paidAmount: 100, purpose: "Treatment"}
date:
21/02/2018},
{data:
{paidAmount: 400, purpose: "Medicine"}
date:
20/02/2018},
{data:
{paidAmount: 200, purpose: "Treatment"}
date:
21/02/2018}],
{data:
{paidAmount: 400, purpose: "Treatment"}
date:
10/02/2018}

In the above array,3 same date objects are present and I need to make that 3 objects as 1 consisting of date property same and having data property as array like as below: [{date:21/02/2018,data:[{paidAmount: 850, purpose: "Medicine"}, {paidAmount: 100, purpose: "Treatment"},{paidAmount: 200, purpose: "Treatment"}]},{date:20/02/2018,data:{paidAmount: 400, purpose: "Medicine"}]. How can I implement this one? ,

srujana
  • 433
  • 1
  • 10
  • 33
  • Nothing to do with angular - just a TS/JS data manipulation issue. Possible duplicate of https://stackoverflow.com/questions/6237537/finding-matching-objects-in-an-array-of-objects – match Feb 24 '18 at 10:08

1 Answers1

0

While this question doesn't have anything to do with Angular or Typescript, here's a working solution:

const dataset = [
  {
   data: {
     paidAmount: 850,
      purpose: "Medicine"
    },
   date: '21/02/2018'
  },
  {
   data: {
     paidAmount: 100,
      purpose: "Treatment"
    },
    date: '21/02/2018'
  },
  {
   data: {
     paidAmount: 400,
      purpose: "Medicine"
    },
    date: '20/02/2018'
  },
  {
   data: {
     paidAmount: 200,
      purpose: "Treatment"
    },
    date: '21/02/2018'
  },
  {
   data: {
     paidAmount: 400,
      purpose: "Treatment"
    },
    date: '10/02/2018'
  }
]

const hash = {};
dataset.forEach(x => {
 if (!hash[x.date]) {
   hash[x.date] = [x.data];
    return;
  }
  
  hash[x.date].push(x.data);
});

const transformed = [];

for (date in hash) {
 transformed.push({date, data: hash[date]});
}

console.log(transformed);
Boris Lobanov
  • 2,409
  • 1
  • 11
  • 19