javascript - 检查嵌套数组中的元素
问题描述
我有以下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
有人可以帮助实现这一目标。谢谢!!!
解决方案
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.filter
ES6 中),并将结果水合到结果输出中。
推荐阅读
- r - 如何在数据框中使用循环存储生成的数字
- css - Bootstrap 4 - 为什么文本侵占填充?我该如何阻止它?
- tensorflow - Keras 功能 API 不会在 google colab 上创建任何层(model.summary() 不打印任何层)
- laravel - Laravel 辛烷值 Xdebug
- mysql - 用 REGEXP .* 更新 MYSQL 表?
- javascript - 在 Next.JS 的 `getStaticPaths` 中设置`fallback: true` 时`throw new Error('Failed to load static props')`
- java - OIM 托管服务器引导配置问题
- c# - 如何通过C#中的特定片段从句子中提取整个单词?
- python - 在 Pygame 中显示 FPS
- signalr - 由于 Azure ADB2C,Blazor Server SignalR 集线器在 StartAsync 上失败