Группировка по нескольким полям в Nodejs с использованием Lodash - PullRequest
0 голосов
/ 20 декабря 2018

В настоящее время я группирую свои данные по аккаунту, но мне также нужно сгруппировать их по продавцу.Однако я не могу понять, как успешно реализовать эту функцию, чтобы она группировалась по нескольким полям одновременно.Может ли кто-нибудь предложить какое-нибудь руководство относительно того, как я могу это сделать?

Вот моя функция, которая группирует мои данные на данный момент:

filteredData[rep.id] = _.chain(filteredData[rep.id]).groupBy('account').map(function(v, i) {
          return {
              customer: i,
              salesperson: _.reduce(v, function(res, val) {
                  return val['salesperson'];
              },0),
              sales_ytd: _.reduce(v, function(res, val) {
                  return res + Number(val['sales - ytd']);
              },0),
              mgn$_ytd: _.reduce(v, function(res, val) {
                  return res + Number(val['margin - ytd']);
              },0),
              sales_last: _.reduce(v, function(res, val) {
                  return res + Number(val['sales - pytd']);
              },0),
              mgn$_last: _.reduce(v, function(res, val) {
                  return res + Number(val['margin - pytd']);
              },0)
    }
}).value();

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Немного неясно понять ваш код без входных данных и ожидаемого результата, но я полагаю, что вы группируете данные и форматируете результат за один раз.может быть, вы могли бы рассмотреть разделение задач написания функции:

const formatData = (object, index) => {
  return =  {
    customer: index,
    salesperson: _.reduce(object, function(res, val) {
        return val['salesperson'];
    },0),
    sales_ytd: _.reduce(object, function(res, val) {
        return res + Number(val['sales - ytd']);
    },0),
    mgn$_ytd: _.reduce(object, function(res, val) {
        return res + Number(val['margin - ytd']);
    },0),
    sales_last: _.reduce(object, function(res, val) {
        return res + Number(val['sales - pytd']);
    },0),
    mgn$_last: _.reduce(object, function(res, val) {
        return res + Number(val['margin - pytd']);
    },0)
  }
}

Затем вы можете перебрать список предложений группировки и вернуть объект, содержащий несколько групп:

const groupFormatedDataBy = ( ...groupingClasses ) => {
  let output = {}
  grupingClasses.forEach(groupingClass => {

    output[groupingClass] = _.chain(filteredData[rep.id])
       .groupBy(groupingClass)
       .map( formatData )
       .value();

  })

  return output
}

PS:Я не смог протестировать код без примера данных jejeje, надеюсь, он вам поможет

0 голосов
/ 20 декабря 2018

Вам нужно объединить значения полей, когда вам нужно сгруппировать по нескольким полям.

Пример (не проверено):

filteredData[rep.id] = _(filteredData[rep.id])
  .groupBy(function(o) {
    return o.account + '-'  + o.salesperson;
  })
  .map(function(v, i) {
    var customer = _.head(_.words(i));

    return {
        customer: customer,
        salesperson: _.reduce(v, function(res, val) {
            return val['salesperson'];
        },0),
        sales_ytd: _.reduce(v, function(res, val) {
            return res + Number(val['sales - ytd']);
        },0),
        mgn$_ytd: _.reduce(v, function(res, val) {
            return res + Number(val['margin - ytd']);
        },0),
        sales_last: _.reduce(v, function(res, val) {
            return res + Number(val['sales - pytd']);
        },0),
    mgn$_last: _.reduce(v, function(res, val) {
        return res + Number(val['margin - pytd']);
    },0)
};

}). Value ();

...