我正在嘗試解決我的 API 中的調度問題,并且我對物件陣列的操作有一些疑問。我創建了一個回傳與忙碌日期不同的日期的邏輯,但我無法解決時間問題。我有一個名為 listDates 的陣列:
listDates =
[
{
"date": "01/05/2022",
"hour": [
"7:30:00",
"8:00:00",
"8:30:00",
"9:00:00",
"9:30:00",
"10:00:00",
"10:30:00",
"11:00:00",
"11:30:00",
"12:00:00",
"12:30:00",
"13:00:00",
"13:30:00",
"14:00:00",
"14:30:00",
"15:00:00",
"15:30:00",
"16:00:00",
"16:30:00",
"17:00:00"
]
},
{
"date": "02/05/2022",
"hour": [
"7:30:00",
"8:00:00",
"8:30:00",
"9:00:00",
"9:30:00",
"10:00:00",
"10:30:00",
"11:00:00",
"11:30:00",
"12:00:00",
"12:30:00",
"13:00:00",
"13:30:00",
"14:00:00",
"14:30:00",
"15:00:00",
"15:30:00",
"16:00:00",
"16:30:00",
"17:00:00"
]
},
...
]
我想過濾掉與這個名為occupedDateHour的陣列不同的所有內容:
occupiedDateHour =
[
{
"date": "02/05/2022",
"hour": [
"16:00:00"
]
},
{
"date": "01/05/2022",
"hour": [
"14:00:00"
]
}
]
我需要類似的東西:
newListDates =
[
{
"date": "01/05/2022",
"hour": [
"7:30:00",
"8:00:00",
"8:30:00",
"9:00:00",
"9:30:00",
"10:00:00",
"10:30:00",
"11:00:00",
"11:30:00",
"12:00:00",
"12:30:00",
"13:00:00",
"13:30:00",
"14:30:00",
"15:00:00",
"15:30:00",
"16:00:00",
"16:30:00",
"17:00:00"
]
},
{
"date": "02/05/2022",
"hour": [
"7:30:00",
"8:00:00",
"8:30:00",
"9:00:00",
"9:30:00",
"10:00:00",
"10:30:00",
"11:00:00",
"11:30:00",
"12:00:00",
"12:30:00",
"13:00:00",
"13:30:00",
"14:00:00",
"14:30:00",
"15:00:00",
"15:30:00",
"16:30:00",
"17:00:00"
]
},
...
]
如果某個日期的所有時間都已被占用,它甚至不會回傳該特定日期。我寫的回傳日期的邏輯:
newListDates = listDates.filter(function (arr) {
return occupiedDateHour.some(function (f) {
return f.date === arr.date
});
});
uj5u.com熱心網友回復:
您可以使用 , 和 的組合,Array#reduce如以下演示所示:Array#mapArray#filter
const listDates = [ { "date": "01/05/2022", "hour": [ "7:30:00", "8:00:00", "8:30:00", "9:00:00", "9:30:00", "10:00:00", "10:30:00", "11:00:00", "11:30:00", "12:00:00", "12:30:00", "13:00:00", "13:30:00", "14:00:00", "14:30:00", "15:00:00", "15:30:00", "16:00:00", "16:30:00", "17:00:00" ] }, { "date": "02/05/2022", "hour": [ "7:30:00", "8:00:00", "8:30:00", "9:00:00", "9:30:00", "10:00:00", "10:30:00", "11:00:00", "11:30:00", "12:00:00", "12:30:00", "13:00:00", "13:30:00", "14:00:00", "14:30:00", "15:00:00", "15:30:00", "16:00:00", "16:30:00", "17:00:00" ] } ],
occupiedDateHour = [ { "date": "02/05/2022", "hour": [ "16:00:00" ] }, { "date": "01/05/2022", "hour": [ "14:00:00" ] } ],
obj = occupiedDateHour.reduce((acc,{date,hour}) => ({...acc,[date]:hour}),{}),
output = listDates.map(
({ date, hour }) =>
({
date,
hour: hour.filter(h => !(obj[date] || []).includes(h))
})
);
console.log( output );
uj5u.com熱心網友回復:
您可以嘗試使用一些邏輯map來find處理過濾器
const listDates=[{"date":"01/05/2022","hour":["7:30:00","8:00:00","8:30:00","9:00:00","9:30:00","10:00:00","10:30:00","11:00:00","11:30:00","12:00:00","12:30:00","13:00:00","13:30:00","14:00:00","14:30:00","15:00:00","15:30:00","16:00:00","16:30:00","17:00:00"]},{"date":"02/05/2022","hour":["7:30:00","8:00:00","8:30:00","9:00:00","9:30:00","10:00:00","10:30:00","11:00:00","11:30:00","12:00:00","12:30:00","13:00:00","13:30:00","14:00:00","14:30:00","15:00:00","15:30:00","16:00:00","16:30:00","17:00:00"]},]
const occupiedDateHour=[{"date":"02/05/2022","hour":["16:00:00"]},{"date":"01/05/2022","hour":["14:00:00"]}]
const newListDates = listDates.map((currentDateData) => {
const currentOccupiedDateHour = occupiedDateHour.find(dateData => dateData.date === currentDateData.date)
if (!currentOccupiedDateHour) {
return currentDateData
}
return {
date: currentDateData.date,
hour: currentDateData.hour.filter(currentHour => !currentOccupiedDateHour.hour.includes(currentHour))
}
})
console.log(newListDates)
.as-console-wrapper { max-height: 100% !important; top: 0; }
uj5u.com熱心網友回復:
我將首先轉換occupiedDateHour 為更適合過濾的物件:
const occupiedDateHour = [
{ "date": "02/05/2022", "hour": ["16:00:00"] },
{ "date": "01/05/2022", "hour": ["14:00:00"] }
];
const occupiedDateHourIndex = occupiedDateHour.reduce((acc, el) => {
acc[el.date] = el.hour;
}, {});
產生這樣的結構:
{
"02/05/2022" : ["16:00:00"], "01/05/2022": ["14:00:00"]
}
添加過濾功能:
const filterHours = (hours, excludeHours) => {
return hours.filter(h => !excludeHours.includes(h));
};
有了它,您可以對給定日期排除的小時串列進行 O(1) 查找;并按該排除串列過濾給定日期的小時數。
應用過濾器,您就完成了:
const newListDates = listDates.map(el => {
const date = el.date;
const hour = filterHours(el.hour, occupiedDateHourIndex[date]);
return { date, hour }
})
演示...
const occupiedDateHour = [
{
"date": "02/05/2022",
"hour": ["16:00:00"]
},
{
"date": "01/05/2022",
"hour": ["14:00:00"]
}
];
const occupiedDateHourIndex = occupiedDateHour.reduce((acc, el) => {
acc[el.date] = el.hour;
return acc;
}, {});
const filterHours = (hours, excludeHours) => {
return hours.filter(h => !excludeHours.includes(h));
};
const listDates = [ { "date": "01/05/2022", "hour": [ "7:30:00", "8:00:00", "8:30:00", "9:00:00", "9:30:00", "10:00:00", "10:30:00", "11:00:00", "11:30:00", "12:00:00", "12:30:00", "13:00:00", "13:30:00", "14:00:00", "14:30:00", "15:00:00", "15:30:00", "16:00:00", "16:30:00", "17:00:00" ] }, { "date": "02/05/2022", "hour": [ "7:30:00", "8:00:00", "8:30:00", "9:00:00", "9:30:00", "10:00:00", "10:30:00", "11:00:00", "11:30:00", "12:00:00", "12:30:00", "13:00:00", "13:30:00", "14:00:00", "14:30:00", "15:00:00", "15:30:00", "16:00:00", "16:30:00", "17:00:00" ] } ]
const newListDates = listDates.map(el => {
const date = el.date;
const hour = filterHours(el.hour, occupiedDateHourIndex[date]);
return { date, hour }
})
console.log(JSON.stringify(newListDates, null, 4))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/473556.html
標籤:javascript 数组
