javascript - 检查嵌套数组中的元素

标签 javascript arrays loops lodash

我有下面的 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)
    })
})

但不知道如何检查 dayOfWeek 不存在于 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 中的当前日期之间的差异通过 ( lodash 中的 _.difference & _.range和 ES6 中的 Array.filter)并在结果输出中将结果混合。

关于javascript - 检查嵌套数组中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53358251/

相关文章:

javascript - 如何使用javascript隐藏多个元素

php - 如何从数组中删除所有 html 标签?

javascript - 获取原始图像进行裁剪,忽略宽度属性?

javascript - 添加时间类型的输入值 -html

php函数内爆调整

php - 需要帮助来修复我使用对象代码创建的多维数组

c - 这个for循环是如何工作的?

java - 改进两次遍历数组(同一数组上的嵌套循环)

php - 引号中的 Javascript 变量

algorithm - 一个元素太大的数组/队列的含义和含义是什么?