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

使用Lodash在NodeJ中按多个字段分组

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

    我目前正在按帐户对数据进行分组,但也需要按销售人员对数据进行分组。但是,我不知道如何成功实现该功能,以便同时按多个字段对其进行分组。有没有人能给我一些指导,告诉我怎么做?

    以下是我的函数,它将我的数据分组到当前:

    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 回复  |  直到 6 年前
        1
  •  1
  •   Ori Drori    6 年前

    当需要按多个字段分组时,需要组合字段值。

    示例(未测试):

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

        2
  •  0
  •   Eric Van Der Dijs    6 年前

    在没有输入数据和预期结果的情况下理解代码有点不清楚,但是,我相信您是在一次扫描中对数据进行分组并格式化结果。也许你可以考虑分开功能写作的关注点:

    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,希望它能帮助您