我在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
的{{1}}数组中都不存在
这是我想要的输出
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
。
有人可以帮助实现这一目标吗?谢谢!!!
答案 0 :(得分:2)
您可以在一周中的所有天创建一个数组,并根据您的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)
答案 1 :(得分:2)
仅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>
这个想法是通过lodash和{{3中的_.difference
和_.range
使用1...7
的范围与每个room.schedule
中当前日期之间的差}}(在ES6中),然后将结果水合到结果输出中。
答案 2 :(得分:1)
这是代码
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)
答案 3 :(得分:1)
您可以将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; }