簡體   English   中英

檢查嵌套數組中的元素

[英]Check for the element inside the nested array

我在json下面

const data = {
    rooms: [
        {
            roomId: 1,
            schedules: [
                { home1: "06:00", dayOfWeek: 1, away: "21:30" },
                { home1: "06:05", dayOfWeek: 2, away: "22:30" }
            ]
        },
        {
            roomId: 2,
            schedules: [
                { home1: "06:00", dayOfWeek: 4, away: "21:30" },
                { home1: "06:05", dayOfWeek: 5, away: "22:30" }
            ]
        }
    ]
}

現在,我需要將上述元素推為dayOfWeek,這兩個roomsschedules數組中都沒有

這是我想要的輸出

const finalOuput = [
    //for room 1
    { home1: "00:00", dayOfWeek: 3, away: "02:30", roomId: 1 },
    { home1: "00:00", dayOfWeek: 4, away: "02:30", roomId: 1 },
    { home1: "00:00", dayOfWeek: 5, away: "02:30", roomId: 1 },
    { home1: "00:00", dayOfWeek: 6, away: "02:30", roomId: 1 },
    { home1: "00:00", dayOfWeek: 7, away: "02:30", roomId: 1 },
    //for room 2
    { home1: "00:00", dayOfWeek: 1, away: "02:30", roomId: 2 },
    { home1: "00:00", dayOfWeek: 2, away: "02:30", roomId: 2 },
    { home1: "00:00", dayOfWeek: 3, away: "02:30", roomId: 2 },
    { home1: "00:00", dayOfWeek: 6, away: "02:30", roomId: 2 },
    { home1: "00:00", dayOfWeek: 7, away: "02:30", roomId: 2 },
]

我試過像這樣的rooms數組循環

const finalOuput = []
rooms.map((room) => {
    room.schedules.map((schedule) => {
        finalOuput.push(schedule)
    })
})

但是不知道如何檢查rooms時間表中沒有的dayOfWeek

有人可以幫助實現這一點。 謝謝!!!

您可以在一周中的所有日期創建一個數組,並根據schedules是否存在該日期進行過濾。

然后映射到過濾后的數組並構建您的對象:

 const data = {rooms: [{roomId: 1,schedules: [{ home1: "06:00", dayOfWeek: 1, away: "21:30" },{ home1: "06:05", dayOfWeek: 2, away: "22:30" }]},{roomId: 2,schedules: [{ home1: "06:00", dayOfWeek: 4, away: "21:30" },{ home1: "06:05", dayOfWeek: 5, away: "22:30" }]}]} const days = [1, 2, 3, 4, 5, 6, 7] const template = { home1: "00:00", away: "02:30", } const rooms = data.rooms.reduce((arr, {roomId, schedules}) => { // missing is the days no presesnt in schedules let missing = days.filter(day => !schedules.find(s => s.dayOfWeek == day )) return arr.concat( ... missing.map(d => Object.assign({}, template, {dayOfWeek: d,room: roomId}))) }, []) console.log(rooms) 

僅ES6解決方案

 const data = { rooms: [{ roomId: 1, schedules: [{ home1: "06:00", dayOfWeek: 1, away: "21:30", roomId: 1 }, { home1: "06:05", dayOfWeek: 2, away: "22:30", roomId: 1 } ] }, { roomId: 2, schedules: [{ home1: "06:00", dayOfWeek: 4, away: "21:30", roomId: 2 }, { home1: "06:05", dayOfWeek: 5, away: "22:30", roomId: 2 } ] } ] } const getSchedules = (room) => { let weekDays = [...Array(8).keys()] weekDays.shift() let days = weekDays.filter(x => !room.schedules.some(y => y.dayOfWeek == x)) return days.map(y => ({ home1: "00:00", dayOfWeek: y, away: "02:30", roomId: room.roomId })) } console.log(data.rooms.reduce((r,c) => (r.push(...getSchedules(c)), r), [])) 

Lodash版本:

 const data = { rooms: [{ roomId: 1, schedules: [{ home1: "06:00", dayOfWeek: 1, away: "21:30", roomId: 1 }, { home1: "06:05", dayOfWeek: 2, away: "22:30", roomId: 1 } ] }, { roomId: 2, schedules: [{ home1: "06:00", dayOfWeek: 4, away: "21:30", roomId: 2 }, { home1: "06:05", dayOfWeek: 5, away: "22:30", roomId: 2 } ] } ] } const getSchedules = (room) => { let days = _.difference(_.range(1,8), _.map(room.schedules, 'dayOfWeek')) return days.map(y => ({ home1: "00:00", dayOfWeek: y, away: "02:30", roomId: room.roomId })) } console.log(_.reduce(data.rooms, (r,c) => (r.push(...getSchedules(c)), r), [])) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script> 

這個想法是使用1...7的范圍與每個room.schedule的當前日期之間的room.schedule (通過_.difference_.range .range和ES6中的_.range進行調度, Array.filter將結果Array.filter到結果輸出。

這是代碼

 const data = { rooms: [ { roomId: 1, schedules: [ { home1: "06:00", dayOfWeek: 1, away: "21:30" }, { home1: "06:05", dayOfWeek: 2, away: "22:30" } ] }, { roomId: 2, schedules: [ { home1: "06:00", dayOfWeek: 4, away: "21:30" }, { home1: "06:05", dayOfWeek: 5, away: "22:30" } ] } ] } let output = [] for (let room of data.rooms) { let days = [] room.schedules.map(s => days.push(parseInt(s.dayOfWeek))) days = new Set(days) for(let i = 1; i <= 7; i++) { if(!days.has(i)) output.push({ 'home1': '00:00', 'dayOfWeek': i, 'away': '02:30', 'roomId': room.roomId }) } } console.log(output) 

您可以將Array.prototype.reduce()Array.prototype.concat()Array.prototype.filter()Array.prototype.find()Array.prototype.map()結合使用

碼:

 const data = {rooms: [{roomId: 1,schedules: [{ home1: "06:00", dayOfWeek: 1, away: "21:30" },{ home1: "06:05", dayOfWeek: 2, away: "22:30" }]},{roomId: 2,schedules: [{ home1: "06:00", dayOfWeek: 4, away: "21:30" },{ home1: "06:05", dayOfWeek: 5, away: "22:30" }]}]} const finalOuput = data.rooms.reduce((a, c) => a.concat( [1, 2, 3, 4, 5, 6, 7] .filter(d => !c.schedules.find(s => s.dayOfWeek === d)) .map(availableDay => ({ roomId: c.roomId, home1: '00:00', dayOfWeek: availableDay, away: '02:30' })) ), []); console.log(finalOuput); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM