【问题标题】:Typescript/lodash: how to get results/objects with multiple common propertiesTypescript/lodash:如何获取具有多个公共属性的结果/对象
【发布时间】:2018-09-16 23:31:12
【问题描述】:

我正在为具有多个属性的 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
    }
]

打字稿代码:

  // 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”分组余额聚合,因为我已应用基于属性“id”的 lodash“_groupBy”函数。

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

在 lodash/typescript 中有什么方法可以让我们使用多个属性来应用 grouby 吗?

预期的输出应该是:

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

【问题讨论】:

  • 给定输入数组,您能否举一个您希望的输出示例? (在编辑您的问题时)
  • 你想得到什么结果?给我一个例子。
  • 用预期的输出更新了我的问题。

标签: javascript typescript filter group-by lodash


【解决方案1】:

您可以通过从 3 个 id 中创建一个字符串来为 _.groupBy() 生成一个密钥。然后你可以_.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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    相关资源
    最近更新 更多