我有一個物件陣列,每個物件都有四個屬性(id、start、end 和 amount)。
然后根據這些資料,我創建了一個具有以下屬性的新物件陣列:日期、持續時間和數量。日期是開始屬性的時間戳的日期,持續時間是開始時間戳和結束時間戳之間的時間(以分鐘為單位)。
然后我創建了兩個變數,一個來自所選月份,另一個來自所選年份。然后根據選定的月份和年份過濾陣列日期。例如,如果選擇了 11 月,我只想要日期從 11 月開始的物件。這同樣適用于年份。最終結果是根據所選月份和年份的天數串列。
const arrayOfDates = [
{
id: 1,
start: '2021-12-01T12:10:56 0000',
end: '2021-12-01T12:00:56 0000',
amount: 10
},
{
id: 2,
start: '2021-12-03T11:10:56 0000',
end: '2021-12-03T12:45:56 0000',
amount: 4
},
{
id: 3,
start: '2021-12-07T09:10:56 0000',
end: '2021-12-07T09:25:56 0000',
amount: 8
},
{
id: 4,
start: '2021-11-24T11:10:56 0000',
end: '2021-11-24T11:25:56 0000',
amount: 8
}
]
const selectedMonth = 12
const selectedYear = 2021
const mapped = arrayOfDates.map((el) => ({
date: new Date(el.start).toLocaleDateString('en-CA'),
duration: new Date(new Date(el.end).getTime() - new Date(el.start).getTime()).getMinutes(),
amount: el.amount
}))
const filteredBySelectedDate = mapped.filter((el) => {
var [year, month] = el.date.split('-')
return selectedMonth === month && selectedYear === year;
})
const mappedByDays = filteredBySelectedDate
但是,除了按天列出陣列的元素(這是我目前擁有的結果)。我想使用filteredBySelectedDate陣列按周過濾。換句話說,我想根據一個月的周數范圍對陣列的元素進行分組。像這樣的陣列:
const mappedByWeeks = [
{
interval: '12/01 - 12/04',
duration: 85,
amount: 14
},
{
interval: '12/05 - 12/11',
duration: 15,
amount: 8
}
]
uj5u.com熱心網友回復:
這可以通過幾個步驟來完成。首先,通過為一個月中的每個星期建立已知的開始/結束天數 ( weekTransitionDays)。其次是識別條目屬于哪一周的方法(getWeekIndex)。最后是將同一周的條目折疊在一起的方法 ( groupByWeek)。
const arrayOfDates = [{
id: 1,
start: '2021-12-01T12:10:56 0000',
end: '2021-12-01T12:00:56 0000',
amount: 10
},
{
id: 2,
start: '2021-12-03T11:10:56 0000',
end: '2021-12-03T12:45:56 0000',
amount: 4
},
{
id: 3,
start: '2021-12-07T09:10:56 0000',
end: '2021-12-07T09:25:56 0000',
amount: 8
},
{
id: 4,
start: '2021-11-24T11:10:56 0000',
end: '2021-11-24T11:25:56 0000',
amount: 8
}
];
const selectedMonth = 12;
const selectedYear = 2021;
const weekTransitionDays = [];
const firstDayOfMonth = (new Date(selectedYear, selectedMonth - 1, 1)).getDay();
const daysInMonth = (new Date(selectedYear, selectedMonth, 0)).getDate();
let start = 1;
if (firstDayOfMonth !== 0) {
let end = start 6 - firstDayOfMonth;
weekTransitionDays.push([start, end]);
start = end;
}
while (start < daysInMonth) {
let end;
if (start 1 < daysInMonth) {
start ;
} else {
break;
}
if (start 6 < daysInMonth) {
end = start 6;
} else {
break;
}
weekTransitionDays.push([start, end]);
start = end;
}
if (weekTransitionDays.at(-1)[1] !== daysInMonth) {
weekTransitionDays.push([start, daysInMonth]);
}
const getWeekIndex = entry => {
const entryStart = new Date(entry.start).getDate();
for (let i = 0; i < weekTransitionDays.length; i ) {
if (weekTransitionDays[i][0] <= entryStart && entryStart <= weekTransitionDays[i][1]) {
return i;
}
}
};
const mapped = arrayOfDates.map((el) => ({
date: new Date(el.start).toLocaleDateString('en-CA'),
duration: new Date(new Date(el.end).getTime() - new Date(el.start).getTime()).getMinutes(),
weekIndex: getWeekIndex(el),
amount: el.amount
}));
const filteredBySelectedDate = mapped.filter((el) => {
var [year, month] = el.date.split('-');
return selectedMonth === month && selectedYear === year;
});
const groupByWeek = () => {
const obj = {};
filteredBySelectedDate.forEach(entry => {
if (!obj.hasOwnProperty(entry.weekIndex)) {
let [start, end] = weekTransitionDays[entry.weekIndex];
if (start < 10) {
start = "0" start;
}
if (end < 10) {
end = "0" end;
}
start = selectedMonth "/" start;
end = selectedMonth "/" end;
obj[entry.weekIndex] = {
interval: start ' - ' end,
duration: 0,
amount: 0
};
}
obj[entry.weekIndex].duration = entry.duration;
obj[entry.weekIndex].amount = entry.amount;
});
return Object.values(obj);
};
const mappedByDays = filteredBySelectedDate;
const groupedByWeek = groupByWeek(mapped);
console.log(groupedByWeek);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/370691.html
標籤:javascript 数组 打字稿 javascript对象
上一篇:Discord.js:commands.map不是ApplicationCommandManager.set的函式
