簡體   English   中英

使用Lodash在Node.js中按多個字段分組

[英]Grouping by multiple fields in Nodejs using Lodash

我目前正在按帳戶對數據進行分組,但也需要按銷售人員進行分組。 但是,我無法弄清楚如何成功實現該功能,以便同時按多個字段對它進行分組。 有人可以提供一些有關我該如何做的指導嗎?

這是我現在對數據進行分組的功能:

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

需要按多個字段分組時,需要合並字段值。

示例(未經測試):

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

})。值();

在沒有輸入數據和預期結果的情況下理解代碼是有點不清楚的,但是,我相信您正在對數據進行分組並一次格式化結果。 也許您可以考慮分離函數編寫的關注點:

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,我無法測試代碼,希望它對您有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM