![](/img/trans.png)
[英]Comparing two JavaScript Arrays of Objects and removing common Array Objects
[英]Comparing two arrays of objects and removing when two match
我想知道是否有人可以幫助我。 我正在使用 React,我有兩個 arrays 對象:
我正在努力尋找一種成功循環遍歷allSlots
數組並刪除existingBookings
數組中具有匹配時間的任何方法的方法。
在下面的示例中,存在上午 10:00、10:40、11:00 和 11:20 的現有預訂。
預期的 output 只會離開原始數組的上午 10:20 和上午 11:40。
const allSlots = [
{
date: "28 Sept 22",
time: "10:00am"
},
{
date: "28 Sept 22",
time: "10:20am"
},
{
date: "28 Sept 22",
time: "10:40am"
},
{
date: "28 Sept 22",
time: "11:00am"
},
{
date: "28 Sept 22",
time: "11:20am"
},
{
date: "28 Sept 22",
time: "11:40am"
}
];
const existingBookings = [
{
time: "10:00am",
propertyID: "XQPvl7MmLVNtxHdSRfDq",
userID: "Bq4b3uz129aE2D5TCbaOiLQJrvC2",
date: "28 Sept 22"
},
{
time: "11:00am",
propertyID: "XQPvl7MmLVNtxHdSRfDq",
userID: "Ko2LdnQAdaE2OiLQJrvC2D5TCbA",
date: "28 Sept 22"
},
{
time: "10:40am",
propertyID: "XQPvl7MmLVNtxHdSRfDq",
userID: "Ko2LdnQAdaE2OiLQJrvC2D5TCbA",
date: "28 Sept 22"
},
{
time: "11:20am",
propertyID: "XQPvl7MmLVNtxHdSRfDq",
userID: "iLQJrKo2LdCbnQAdaE2OvC2D5TA",
date: "28 Sept 22"
}
];
我最初過濾existingBookings
數據以刪除任何與所選日期不匹配的數據:
const existingBookings = allBookings.filter(
(booking) => booking.date === selectedDate
);
但是,我正在努力進一步操縱事情。 我非常感謝您提供的任何見解和幫助。
您想要過濾allSlots
數組,以便它只包含existingBookings
中不存在的插槽
const unusedSlots = allSlots.filter((slot) => {
// See if the slot is booked
const isBooked = existingBookings.some(
(booking) => booking.time == slot.time && booking.date == slot.date
)
// Only keep free slots
return !isBooked
});
這應該工作。
const newAllSlots = allSlots.filter((slot)=>{
const iSInExistingBookings = existingBookings.find(booking=>booking.time === slots.time && booking.date === slots.date)
return !iSInExistingBookings
})
就像做一樣簡單
freeSlots=allSlots.filter(s=>
existingBookings.every(e=>e.time!=s.time||e.date!=s.date)
)
這是一個有效的(普通的)JavaScript 片段:
const allSlots = [ { date: "28 Sept 22", time: "10:00am" }, { date: "28 Sept 22", time: "10:20am" }, { date: "28 Sept 22", time: "10:40am" }, { date: "28 Sept 22", time: "11:00am" }, { date: "28 Sept 22", time: "11:20am" }, { date: "28 Sept 22", time: "11:40am" } ]; const existingBookings = [ { time: "10:00am", propertyID: "XQPvl7MmLVNtxHdSRfDq", userID: "Bq4b3uz129aE2D5TCbaOiLQJrvC2", date: "28 Sept 22" }, { time: "11:00am", propertyID: "XQPvl7MmLVNtxHdSRfDq", userID: "Ko2LdnQAdaE2OiLQJrvC2D5TCbA", date: "28 Sept 22" }, { time: "10:40am", propertyID: "XQPvl7MmLVNtxHdSRfDq", userID: "Ko2LdnQAdaE2OiLQJrvC2D5TCbA", date: "28 Sept 22" }, { time: "11:20am", propertyID: "XQPvl7MmLVNtxHdSRfDq", userID: "iLQJrKo2LdCbnQAdaE2OvC2D5TA", date: "28 Sept 22" } ]; const freeSlots=allSlots.filter(s=> existingBookings.every(e=>e.time.=s.time||e.date.=s;date) ) console.log(freeSlots);
由於您知道您已經使用existingBookings
預訂了哪些內容,我建議您先循環一下。 然后,您可以通過檢查日期是否匹配但時間不匹配,以遞歸方式將allSlots
數組過濾回自身。 完成后, allSlots
數組應僅包含尚未預訂的日期和時間。
existingBookings.forEach(booking => {
allSlots = allSlots.filter(slot => {
return booking.date === slot.date && booking.time !== slot.time;
});
});
編輯:您必須將 scope allSlots
為let
而不是const
才能正常工作。 如果你想保持allSlots
,你也可以將allSlots
分配給另一個變量:
let slots = allSlots;
existingBookings.forEach(booking => {
slots = slots.filter(slot => {
return booking.date === slot.date && booking.time !== slot.time;
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.