我有一个自定义对象数组,其中填充了用户输入。该数组如下所示:
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>
谢谢你。如果我只想要一个小时数的数组,需要做哪些更改?像这样:让小时= [02:00:00、02:00:00、01:00:00]?
@egx,不客气。如果解决了问题,请投票并把答案标记为解决方案。关于您的问题,您可以使用
.map
以下方法:res.map(e => e.Hours)
我将其标记为“原因已解决”,但它似乎可以与该地图一起使用。当我console.log()res时,我仍然得到一个对象数组。我只需要一个带有Hours值的数组。
@egx答案已更新