首页 > 解决方案 > 检查嵌套数组中的元素

问题描述

我有以下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 推送上面的元素,这些元素都不存在于schedules两者的数组中rooms

这是我想要的输出

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)
    })
})

但不知道如何检查时间表dayOfWeek中不存在的内容。rooms

有人可以帮助实现这一目标。谢谢!!!

标签: javascriptarraysloopslodash

解决方案


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_.difference&_.range在 lodash 和Array.filterES6 中),并将结果水合到结果输出中。


推荐阅读