Проверьте наличие элемента во вложенном массиве. - PullRequest
0 голосов
/ 18 ноября 2018

У меня ниже 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

Thisэто вывод, который я хочу

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.

Может кто-нибудь помочь, пожалуйста, добиться этого.Спасибо !!!

Ответы [ 4 ]

0 голосов
/ 18 ноября 2018

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) и просто гидратируйте результат в результате.

0 голосов
/ 18 ноября 2018

Вы можете создать массив по всем дням недели и отфильтровать, если по тому, существует ли этот день в вашем массиве 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)
0 голосов
/ 18 ноября 2018

Вы можете использовать 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; }
0 голосов
/ 18 ноября 2018

Вот код

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