ABC
ABC

Reputation: 832

How to compare/merge the two array in angular

How to compare/merge the two array based on assetCode.

here's the code:

list.component.ts

data = [
    {
      code: "Machine 1",
      assetCode: "PRN",
      assetCount: 1,
      date: "2019-01-18 00:00:00"
    },
    {
      code: "Machine 1",
      assetCode: "PRN",
      assetCount: 1,
      date: "2019-01-19 00:00:00"
    },
    {
      code: "Machine 2",
      assetCode: "PRN 1",
      assetCount: 3,
      date: "2019-01-20 00:00:00"
    },
    {
      code: "Machine 3",
      assetCode: "PRN",
      assetCount: 1,
      date: "2019-01-21 00:00:00"
    },
    {
      code: "Machine 4",
      assetCode: "PRN 1",
      assetCount: 3,
      date: "2019-01-22 00:00:00"
    },
    {
      code: "Machine 5",
      assetCode: "PRN 1",
      assetCount: 3,
      date: "2019-01-23 00:00:00"
    }
  ];
  result = [];
  constructor() {
    this.result = this.setData(this.data);
  }

  setData(paramsArr: Array<any>): Array<any> {
    let newData1 = [];

    paramsArr.forEach(x => {
      const existing = newData1.find((y: any) => format(y.date, 'YYYY-MM') === format(x.date, 'YYYY-MM')
        && y.assetCode === x.assetCode && y.code === x.code);
      if (existing) {
        existing.assetCount += existing.assetCount;
      } else {
        newData1.push(x);
      }
    });

    let newData2 = [];
    newData1.forEach(x => {
      if (newData2.filter((y: any) => y.assetCode === x.assetCode).length <= 0) {
        newData2.push(
          {
            assetCode: x.assetCode,
            date: x.date
          }
        );
      }
    });


    return newData1;
  }

if this assetCode equal to the assetCode then it will display like this enter image description here

Upvotes: 3

Views: 368

Answers (1)

Adrian Brand
Adrian Brand

Reputation: 21638

This is a good use case for a reduce

data = [
    {
      code: "Machine 1",
      assetCode: "PRN",
      assetCount: 1,
      date: "2019-01-18 00:00:00"
    },
    {
      code: "Machine 1",
      assetCode: "PRN",
      assetCount: 1,
      date: "2019-01-19 00:00:00"
    },
    {
      code: "Machine 2",
      assetCode: "PRN 1",
      assetCount: 3,
      date: "2019-01-20 00:00:00"
    },
    {
      code: "Machine 3",
      assetCode: "PRN",
      assetCount: 1,
      date: "2019-01-21 00:00:00"
    },
    {
      code: "Machine 4",
      assetCode: "PRN 1",
      assetCount: 3,
      date: "2019-01-22 00:00:00"
    },
    {
      code: "Machine 5",
      assetCode: "PRN 1",
      assetCount: 3,
      date: "2019-01-23 00:00:00"
    }
  ];
  
  const merge = array => array.reduce((results, item) => {
    const data = results.find(i => i.code === item.code);
    if (data) {
      data.assets[item.assetCode] = (data.assets[item.assetCode] || 0) + item.assetCount;
    } else {
      results.push({
        code: item.code,
        assets: { [item.assetCode]: item.assetCount }
      });
    }
    return results;
  }, []);
  
  console.log(merge(data));

Upvotes: 5

Related Questions