使用 lodash/underscore 分组并求和

Group by and sum using lodash/underscore

我有以下数组:

var data = [{ "Username": "rahul.prajapati", "Name": "Rahul Prajapati", "Projectkey": "project1", "Hours": 5, }, { "Username": "rahul.prajapati", "Name": "Rahul Prajapati", "Projectkey": "project1", "Hours": 7.5, }, { "Username": "rahul.prajapati", "Name": "Rahul Prajapati", "Projectkey": "project2", "Hours": 8, }, { "Username": "rahul.prajapati", "Name": "Rahul Prajapati", "Projectkey": "project2", "Hours": 7.5, }, { "Username": "kishor.thakkar", "Name": "Kishor Thakkar", "Projectkey": "project2", "Hours": 0.25, }, { "Username": "kishor.thakkar", "Name": "Kishor Thakkar", "Projectkey": "project2", "Hours": 0.25, }, { "Username": "kishor.thakkar", "Name": "Kishor Thakkar", "Projectkey": "project3", "Hours": 0.25, }, { "Username": "kishor.thakkar", "Name": "Kishor Thakkar", "Projectkey": "project3", "Hours": 1.5, } ]

我需要下面的数组,我需要项目按 "username" 分组,每个数组会有一个 "Projects" 的数组,这个 "Projects" 数组将按 "projectKey" 分组,并且应添加相同 projectKey 的小时数

[{
      "Name": "Rahul Prajapati",
      "Username" "rahul.prajapati",
      "PROJECTS":[
        {
          "ProjectKey" : "project1",
          "Hours" : 12.5
        },
        {
          "ProjectKey" : "project2",
          "Hours" : 15.5
        },
      ]
   },
   {
     "Name": "Kishor Thakkar",
     "Username" "kishor.thakkar",
     "PROJECTS":[
       {
         "ProjectKey" : "project1",
         "Hours" : 0.50
       },
       {
         "ProjectKey" : "project2",
         "Hours" : 1.75
       },
     ]
  }
 ]

是否可以通过Lodash.

请帮忙,我是 lodash 的新手

每一个帮助都是值得赞赏的

这是一个使用 lodash 的解决方案,它被分解成不同的函数以使其更具可读性(我希望如此):

// function used to calculate the total - _.sumBy not available in old lodash
var totalHours = function(total, project){
    return total + project.Hours;
}

// function to sum the hours for each project
var sumProjects = function(projects){
    return {
        Projectkey: projects[0].Projectkey,
        Hours: _.reduce(projects, totalHours, 0)
    }
}

// function to group the projects for each user
var groupProjects = function(projects){
    return _.chain(projects)
        .groupBy('Projectkey')
        .map(sumProjects)
        .value();
}

// first group by Username
var groups = _.groupBy(data, 'Username');

// now build what we want for each group
var result = _.map(groups, function(group){
    return {
        Name: group[0].Name,
        Username: group[0].Username,
        PROJECTS: groupProjects(group)
    };
})

var data = [{
      "Username": "rahul.prajapati",
      "Name": "Rahul Prajapati",
      "Projectkey": "project1",
      "Hours": 5,
    },
    {
      "Username": "rahul.prajapati",
      "Name": "Rahul Prajapati",
      "Projectkey": "project1",
      "Hours": 7.5,
    },
    {
      "Username": "rahul.prajapati",
      "Name": "Rahul Prajapati",
      "Projectkey": "project2",
      "Hours": 8,
    },
    {
      "Username": "rahul.prajapati",
      "Name": "Rahul Prajapati",
      "Projectkey": "project2",
      "Hours": 7.5,
    },
    {
      "Username": "kishor.thakkar",
      "Name": "Kishor Thakkar",
      "Projectkey": "project2",
      "Hours": 0.25,
    },
    {
      "Username": "kishor.thakkar",
      "Name": "Kishor Thakkar",
      "Projectkey": "project2",
      "Hours": 0.25,
    },
    {
      "Username": "kishor.thakkar",
      "Name": "Kishor Thakkar",
      "Projectkey": "project3",
      "Hours": 0.25,
    },
    {
      "Username": "kishor.thakkar",
      "Name": "Kishor Thakkar",
      "Projectkey": "project3",
      "Hours": 1.5,
    }
 ];

var groups = _.groupBy(data, 'Username');

var totalHours = function(total, project){
 return total + project.Hours;
}

var sumProjects = function(projects){
 return {
  Projectkey: projects[0].Projectkey,
  Hours: _.reduce(projects, totalHours, 0)
 }
}

var groupProjects = function(projects){
 return _.chain(projects)
  .groupBy('Projectkey')
  .map(sumProjects)
  .value();
}

var result = _.map(groups, function(group){
 return {
  Name: group[0].Name,
  Username: group[0].Username,
  PROJECTS: groupProjects(group)
 }
})

document.getElementById('result').textContent = JSON.stringify(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.14.0/lodash.min.js"></script>

<p>
  <pre id="result"></pre>
</p>