我有這個陣列
我想將它存盤在按日期分組的新陣列中,并使用新列的每個日期的班次總數進行班次
const arr = [
{ sum: 77, shift: 1, date: "2020-07-05T00:00:00" },
{ sum: 25, shift: 2, date: "2020-07-05T00:00:00" },
{ sum: 05, shift: 2, date: "2020-07-05T00:00:00" },
{ sum: 15, shift: 2, date: "2020-07-05T00:00:00" },
{ sum: 10, shift: 3, date: "2020-07-05T00:00:00" },
{ sum: 13, shift: 1, date: "2020-07-06T00:00:00" },
{ sum: 66, shift: 2, date: "2020-07-06T00:00:00" },
{ sum: 30, shift: 3, date: "2020-07-06T00:00:00" },
{ sum: 50, shift: 1, date: "2020-07-07T00:00:00" },
{ sum: 40, shift: 2, date: "2020-07-07T00:00:00" },
];
我已經計算了總數,但我不知道如何按日期和班次分組
我想要這樣的輸出
| 日期 | 班次 1 | 班次 2 | 班次 3 | 總計 |
|---|---|---|---|---|
| 07-05-2020 | 77 | 45 | 10 | 132 |
| 07-06-2020 | 13 | 66 | 30 | 109 |
| 07-07-2020 | 50 | 40 | 90 |
我試過了,但沒有回傳正確的值
const grouped = arr.reduce((acc, { sum, shift, date }) => {
let dateKey = date.slice(0, 10);
acc[dateKey] = acc[dateKey] || {};
acc[dateKey][`Shift${shift}`] = sum;
acc[dateKey].total = (acc[dateKey].total || 0) sum;
return acc;
}, {});
uj5u.com熱心網友回復:
我認為這個功能是你需要的。
const computeArray = (arr) => {
const result = {}
arr.forEach(item => {
const field = `shift${item.shift}`
if(!result[item.date]) {
result[item.date] = {}
}
result[item.date][field] = (result[item.date][field] || 0) item.sum
result[item.date].total = (result[item.date].total || 0) item.sum
})
return Object.keys(result).map(key => ({
date: key,
...result[key]
}))
}
uj5u.com熱心網友回復:
使用reduce方法如下
const arr = [
{ sum: 77, shift: 1, date: "2020-07-05T00:00:00" },
{ sum: 25, shift: 2, date: "2020-07-05T00:00:00" },
{ sum: 05, shift: 2, date: "2020-07-05T00:00:00" },
{ sum: 15, shift: 2, date: "2020-07-05T00:00:00" },
{ sum: 10, shift: 3, date: "2020-07-05T00:00:00" },
{ sum: 13, shift: 1, date: "2020-07-06T00:00:00" },
{ sum: 66, shift: 2, date: "2020-07-06T00:00:00" },
{ sum: 30, shift: 3, date: "2020-07-06T00:00:00" },
{ sum: 50, shift: 1, date: "2020-07-07T00:00:00" },
{ sum: 40, shift: 2, date: "2020-07-07T00:00:00" },
];
const res = Object.values(arr.reduce((acc,curr)=>{
// create an object with `date` as key and value as `curr` if `date` is not present in `acc`
if(!acc[curr.date]){
const {date} = curr;
acc[curr.date] = {date};
}
// add "sum" if same shift found
if(acc[curr.date][`shift${curr.shift}`]){
acc[curr.date][`shift${curr.shift}`] = curr.sum;
}else{
acc[curr.date][`shift${curr.shift}`] = curr.sum
}
// for total
if(!acc[curr.date].total){
acc[curr.date].total = curr.sum;
}else{
acc[curr.date].total = curr.sum;
}
return acc
},{}))
console.log(res)
uj5u.com熱心網友回復:
你有一個幾乎完整的解決方案。我只是稍微修改了一下。
const arr = [{ sum: 77, shift: 1, date: "2020-07-05T00:00:00" },{ sum: 25, shift: 2, date: "2020-07-05T00:00:00" },{ sum: 05, shift: 2, date: "2020-07-05T00:00:00" },{ sum: 15, shift: 2, date: "2020-07-05T00:00:00" },{ sum: 10, shift: 3, date: "2020-07-05T00:00:00" },{ sum: 13, shift: 1, date: "2020-07-06T00:00:00" },{ sum: 66, shift: 2, date: "2020-07-06T00:00:00" },{ sum: 30, shift: 3, date: "2020-07-06T00:00:00" },{ sum: 50, shift: 1, date: "2020-07-07T00:00:00" },{ sum: 40, shift: 2, date: "2020-07-07T00:00:00" },];
const grouped = arr.reduce((acc, { sum, shift, date }) => {
const shiftName = `Shift${shift}`;
acc[date] ??= { date, total: 0 };
acc[date].total = sum;
acc[date][shiftName] ??= 0;
acc[date][shiftName] = sum;
return acc;
}, {});
const result = Object.values(grouped);
console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/512810.html
