[英]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,這兩個rooms
的schedules
數組中都沒有
這是我想要的輸出
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.