检查嵌套数组中的元素

时间:2018-11-18 05:46:22

标签: 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推送上述元素,而这两个元素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

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

4 个答案:

答案 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; }