代码之家  ›  专栏  ›  技术社区  ›  SatAj

Typescript/lodash:如何获得具有多个公共属性的结果/对象

  •  0
  • SatAj  · 技术社区  · 6 年前

    我正在为具有多个属性的groupBy函数寻找lodash/typerscript解决方案。 以下是我迄今为止尝试过的:

    JSON码:

    [
        {
            "jobId": 1001,
            "id": 1,
            "timeSegmentId": 1,
            "balance": 100
        },
        {
            "jobId": 1001,
            "id": 2,
            "timeSegmentId": 1,
            "balance": 100
        },
        {
            "jobId": 1002,
            "id": 1,
            "timeSegmentId": 1,
            "balance": 100
        },
        {
            "jobId": 1002,
            "id": 1,
            "timeSegmentId": 1,
            "balance": 100
        },
        {
            "jobId": 1003,
            "id": 1,
            "timeSegmentId": 1,
            "balance": 100
        },
        {
            "jobId": 1003,
            "id": 1,
            "timeSegmentId": 2,
            "balance": 100
        },
        {
            "jobId": 1003,
            "id": 1,
            "timeSegmentId": 2,
            "balance": 100
        },
        {
            "jobId": 1003,
            "id": 1,
            "timeSegmentId": 2,
            "balance": 100
        },
        {
            "jobId": 1003,
            "id": 1,
            "timeSegmentId": 2,
            "balance": 100
        }
    ]
    

    Typescript代码:

      // Group of same ids
      let mergeResults = _.groupBy(this.BSSDealresults, function (n) {
         return n.timeSegmentId;
      });
      const objKeys = Object.keys(mergeResults);
      const AggregateResults = [];
      objKeys.forEach(item => {
        if (mergeResults[item].length > 1) {
    
          let agg_balance = 0;
    
          mergeResults[item].forEach(element => {
            agg_balance += element.balance;
          });
          AggregateResults.push({
            id: mergeResults[item][0].id,
            jobId: mergeResults[item][0].jobId,
            balance: agg_balance
          });
        } else {
          AggregateResults.push(mergeResults[item][0]);
        }
      })
    

    然而,我正在寻找基于多个属性的聚合结果,例如id、jobId和timeSegId。

    在lodash/typescript中,有没有什么方法可以通过使用多个属性来应用程序?

    预期输出应为:

    [
        {
            "jobId": 1001,
            "id": 1,
            "timeSegmentId": 1,
            "balance": 100
        },
        {
            "jobId": 1001,
            "id": 2,
            "timeSegmentId": 1,
            "balance": 100
        },
        {
            "jobId": 1002,
            "id": 1,
            "timeSegmentId": 1,
            "balance": 200
        },
        {
            "jobId": 1003,
            "id": 1,
            "timeSegmentId": 1,
            "balance": 100
        },
        {
            "jobId": 1003,
            "id": 1,
            "timeSegmentId": 2,
            "balance": 100
        },
        {
            "jobId": 1003,
            "id": 1,
            "timeSegmentId": 2,
            "balance": 300
        }
    ]
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Ori Drori    6 年前

    _.groupBy() 通过从3个ID中创建一个字符串。那你就可以了 _.map() 小组 BSSDealresults 对象,使用 object spread (或 Object.assign() _.sumBy()

    const BSSDealresults = [{"jobId":1001,"id":1,"timeSegmentId":1,"balance":100},{"jobId":1001,"id":2,"timeSegmentId":1,"balance":100},{"jobId":1002,"id":1,"timeSegmentId":1,"balance":100},{"jobId":1002,"id":1,"timeSegmentId":1,"balance":100},{"jobId":1003,"id":1,"timeSegmentId":1,"balance":100},{"jobId":1003,"id":1,"timeSegmentId":2,"balance":100}];
    
    const mergeResults = _.groupBy(BSSDealresults, ({ id, jobId, timeSegmentId }) => `${id}-${jobId}-${timeSegmentId}`);
    
    const AggregateResults = _.map(mergeResults, group => ({
      ...group[0],
      balance: _.sumBy(group, 'balance')
    }));
    
    console.log(AggregateResults);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>