What I want to have is nested data grouped by the day number.
This is an example of a array that I want to group. I am using the lodash plugin.
[{
"Pnl": 29.0035635,
"date": "11/14/2022",
"dayNumber": 1,
"translationDayOfWeek": "Monday"
},
{
"Pnl": 50.8878545,
"date": "11/08/2022",
"dayNumber": 2,
"translationDayOfWeek": "Tuesday"
},
{
"Pnl": 73.1014552,
"date": "11/08/2022",
"dayNumber": 2,
"translationDayOfWeek": "Tuesday"
},
{
"Pnl": 32.477,
"date": "11/08/2022",
"dayNumber": 6,
"translationDayOfWeek": "Saturday"
},
{
"Pnl": 25.43999561,
"date": "09/30/2022",
"dayNumber": 5,
"translationDayOfWeek": "Friday"
},
{
"Pnl": 17.6294068,
"date": "09/30/2022",
"dayNumber": 1,
"translationDayOfWeek": "Monday"
}]
This is want I want for a output:
[
{
"dayNumber": 1,
"orders": [
{
"Pnl": 29.0035635,
"date": "11/14/2022",
"dayNumber": 1,
"translationDayOfWeek": "Monday"
},
{
"Pnl": 17.6294068,
"date": "09/30/2022",
"dayNumber": 1,
"translationDayOfWeek": "Monday"
}
]
},
{
"dayNumber": 2,
"orders": [
{
"Pnl": 50.8878545,
"date": "11/08/2022",
"dayNumber": 2,
"translationDayOfWeek": "Tuesday"
},
{
"Pnl": 73.1014552,
"date": "11/08/2022",
"dayNumber": 2,
"translationDayOfWeek": "Tuesday"
}
]
}
]
I tried the solutions on stackoverflow post but it's not the result I need.
CodePudding user response:
If you are using loadsh,
const arr = []; //your array
_.map(
_.groupBy(arr, function (obj) {return obj.dayNumber}),
(order,index) => ({dayNumber: index, orders: order})
)
CodePudding user response:
The snippet below does grouping (which is what it looks like the OP wants) using reduce()
.
let data = [{
"Pnl": 29.0035635,
"date": "11/14/2022",
"dayNumber": 1,
"translationDayOfWeek": "Monday"
},
{
"Pnl": 50.8878545,
"date": "11/08/2022",
"dayNumber": 2,
"translationDayOfWeek": "Tuesday"
},
{
"Pnl": 73.1014552,
"date": "11/08/2022",
"dayNumber": 2,
"translationDayOfWeek": "Tuesday"
},
{
"Pnl": 32.477,
"date": "11/08/2022",
"dayNumber": 6,
"translationDayOfWeek": "Saturday"
},
{
"Pnl": 25.43999561,
"date": "09/30/2022",
"dayNumber": 5,
"translationDayOfWeek": "Friday"
},
{
"Pnl": 17.6294068,
"date": "09/30/2022",
"dayNumber": 1,
"translationDayOfWeek": "Monday"
}];
let grouped = data.reduce((acc, el) => {
let dayNumber = el.dayNumber;
acc[dayNumber] ??= { dayNumber, orders: [] };
acc[dayNumber].orders.push(el);
return acc;
}, {});
grouped = Object.values(grouped).sort((a,b) => a.dayNumber-b.dayNumber);
console.log(grouped)
It's possible that the OP also wants the orders
array sorted somehow. But I can't discern how. To do that, iterate the result and do the sort, something like the following:
grouped.forEach(group => group.orders.sort((a,b) => {
/* sort based on some prop the OP hasn't defined */
});
CodePudding user response:
Try this one
const arr = [{
"Pnl": 29.0035635,
"date": "11/14/2022",
"dayNumber": 1,
"translationDayOfWeek": "Monday"
},
{
"Pnl": 50.8878545,
"date": "11/08/2022",
"dayNumber": 2,
"translationDayOfWeek": "Tuesday"
},
{
"Pnl": 73.1014552,
"date": "11/08/2022",
"dayNumber": 2,
"translationDayOfWeek": "Tuesday"
},
{
"Pnl": 32.477,
"date": "11/08/2022",
"dayNumber": 6,
"translationDayOfWeek": "Saturday"
},
{
"Pnl": 25.43999561,
"date": "09/30/2022",
"dayNumber": 5,
"translationDayOfWeek": "Friday"
},
{
"Pnl": 17.6294068,
"date": "09/30/2022",
"dayNumber": 1,
"translationDayOfWeek": "Monday"
}];
const newArr = [];
arr.forEach((i) => {
if (newArr.find(j => j.dayNumber === i.dayNumber)){
const index = newArr.findIndex(j => j.dayNumber === i.dayNumber)
newArr[index].orders.push(i);
}
else {
newArr.push({
dayNumber: i.dayNumber,
orders: [i]
})
}
})
newArr.sort((a, b) => parseInt(a.dayNumber) - parseInt(b.dayNumber))
console.log(newArr)