将对象数组分组并添加时间属性
Group an array of objects and add the time attribute
我有一组自定义对象,其中填充了用户输入。该数组如下所示:
let array = [
{Course: "Design", Hours: "01:00:00", Week: "1"},
{Course: "Design", Hours: "01:00:00", Week: "3"},
{Course: "Design", Hours: "01:00:00", Week: "2"},
{Course: "Design", Hours: "01:00:00", Week: "1"},
{Course: "Design", Hours: "01:00:00", Week: "2"}
]
我需要修改此数组,以便计算同一周的所有小时数,并根据周的顺序将值放入数组中。我想要的结果是这样的:
let newArray = [
{Course: "Design", Hours: "02:00:00", Week: "1"},
{Course: "Design", Hours: "02:00:00", Week: "2"},
{Course: "Design", Hours: "01:00:00", Week: "3"},
]
所以基本上我需要同时排序和计算总和。
您可以使用moment.js
来获取时间字符串的总和。
要按周对项目进行分组,您可以使用 .reduce
。
最后,要按 Week
对项目进行排序,请使用 .sort
:
let array = [
{Course: "Design", Hours: "01:00:00", Week: "1"},
{Course: "Design", Hours: "01:00:00", Week: "3"},
{Course: "Design", Hours: "01:00:00", Week: "2"},
{Course: "Design", Hours: "01:00:00", Week: "1"},
{Course: "Design", Hours: "01:00:00", Week: "2"}
];
const addTwoTimeStrs = (a, b) => {
let sum = moment.duration(a).add(moment.duration(b));
sum = moment.utc(sum.asMilliseconds()).format("HH:mm:ss");
return sum;
}
const arr = Object.values(
array.reduce((acc,item) => {
const { Hours: hours, Week: week } = item;
const weekItem = acc[week];
acc[week] = weekItem
? { ...weekItem, Hours: addTwoTimeStrs(weekItem.Hours,hours) }
: item;
return acc;
}, {})
);
const res = arr.sort((a,b) => Number(a.Week) - Number(b.Week));
console.log(res.map(e => e.Hours));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous"></script>
我有一组自定义对象,其中填充了用户输入。该数组如下所示:
let array = [
{Course: "Design", Hours: "01:00:00", Week: "1"},
{Course: "Design", Hours: "01:00:00", Week: "3"},
{Course: "Design", Hours: "01:00:00", Week: "2"},
{Course: "Design", Hours: "01:00:00", Week: "1"},
{Course: "Design", Hours: "01:00:00", Week: "2"}
]
我需要修改此数组,以便计算同一周的所有小时数,并根据周的顺序将值放入数组中。我想要的结果是这样的:
let newArray = [
{Course: "Design", Hours: "02:00:00", Week: "1"},
{Course: "Design", Hours: "02:00:00", Week: "2"},
{Course: "Design", Hours: "01:00:00", Week: "3"},
]
所以基本上我需要同时排序和计算总和。
您可以使用moment.js
来获取时间字符串的总和。
要按周对项目进行分组,您可以使用 .reduce
。
最后,要按 Week
对项目进行排序,请使用 .sort
:
let array = [
{Course: "Design", Hours: "01:00:00", Week: "1"},
{Course: "Design", Hours: "01:00:00", Week: "3"},
{Course: "Design", Hours: "01:00:00", Week: "2"},
{Course: "Design", Hours: "01:00:00", Week: "1"},
{Course: "Design", Hours: "01:00:00", Week: "2"}
];
const addTwoTimeStrs = (a, b) => {
let sum = moment.duration(a).add(moment.duration(b));
sum = moment.utc(sum.asMilliseconds()).format("HH:mm:ss");
return sum;
}
const arr = Object.values(
array.reduce((acc,item) => {
const { Hours: hours, Week: week } = item;
const weekItem = acc[week];
acc[week] = weekItem
? { ...weekItem, Hours: addTwoTimeStrs(weekItem.Hours,hours) }
: item;
return acc;
}, {})
);
const res = arr.sort((a,b) => Number(a.Week) - Number(b.Week));
console.log(res.map(e => e.Hours));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous"></script>