I have below array :
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,
}
]
I am in need of below array, that I am in need that projects should be grouped by "username", where there will be an array of "Projects" for each array, and this "Projects" array will be grouped by "projectKey" and the hours of same projectKey should be added
[{
"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
},
]
}
]
Is it possible through Lodash.
Please help, I am new to lodash
Every help is appreciable
Here's a solution using lodash which is broken out into distinct functions to make it a bit more readable (I hope):
// 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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With