Typescript / lodash: как получить результаты / объекты с несколькими общими свойствами - PullRequest
0 голосов
/ 17 сентября 2018

Я ищу решение lodash / typerscript для функции groupBy с несколькими свойствами.Вот что я пробовал до сих пор:

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

Это решение дает ухудшение баланса, сгруппированного только по одному и тому же идентификатору.«поскольку я применил функцию« lodash »_groupBy» на основе свойства «id».

В то время как я ищу совокупные результаты, основанные на нескольких свойствах, например, id, jobId и timeSegId.

IsЕсть ли способ в lodash / typcript, где мы можем применить 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
    }
]

1 Ответ

0 голосов
/ 17 сентября 2018

Вы можете сгенерировать ключ для _.groupBy(), создав строку из 3 идентификаторов.Затем вы можете _.map() объект groups BSSDealresults, клонировать 1-й элемент, используя распространение объекта (или 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>
...