如何以角度比较/合并两个数组

时间:2019-11-28 02:17:11

标签: javascript angular typescript

如何基于assetCode比较/合并两个数组。

代码如下:

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;
  }

如果此assetCode等于assetCode,则它将显示为 enter image description here

1 个答案:

答案 0 :(得分:5)

这是一个简化的好用例

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));