首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将所有客房的TimeSlots组合起来

将所有客房的TimeSlots组合起来
EN

Stack Overflow用户
提问于 2019-07-26 05:20:02
回答 3查看 302关注 0票数 2

假设我有三个房间,分别有可用的时隙和总时隙。

总时隙:

代码语言:javascript
复制
["09:00-10:00","10:00-11:00", "11:00-12:00",  "12:00-13:00", "13:00-14:00", "14:00-15:00"]

Room1可用于

代码语言:javascript
复制
[ "10:00-11:00", "11:00-12:00",  "12:00-13:00"]

Room2可用于

代码语言:javascript
复制
[ "11:00-12:00",  "12:00-13:00", "13:00-14:00"]

Room3可用于

代码语言:javascript
复制
[ "12:00-13:00", "13:00-14:00", "14:00-15:00"]

我想用房间号过滤掉可用的时隙,所以我希望我的输出是这样的。

代码语言:javascript
复制
[{
    slot: "09:00-10:00",
    available: false,
    space : []
},{
    slot: "10:00-11:00",
    available: true,
    space : ["room1"]
},{
    slot: "11:00-12:00",
    available: true,
    space : ["room1", "room2"]
},{
    slot: "12:00-13:00",
    available: true,
    space : ["room1", "room2", "room3"]
},{
    slot: "13:00-14:00",
    available: true,
    space : ["room2", "room3"]
},{
    slot: "14:00-15:00",
    available: true,
    space : ["room3"]
}]

我试过的是:

代码语言:javascript
复制
const ts = ['10:00-10:30', '10:30-11:00', '11:00-11:30', '11:30-12:00', '12:00-12:30', '12:30-13:00', '13:00-13:30', '13:30-14:00', '14:00-14:30', '14:30-15:00', '15:00-15:30', '15:30-16:00'];

const room1 = ["11:00-11:30", "13:05-13:35", "14:05-14:15"];

const avail = (ts, booked) =>
  ts.map(item => {
    const [start, end] = item.split('-');
    const isBooked = booked
      .map(item => item.split('-'))
      .some(([bookedStart, bookedEnd]) =>
        (start >= bookedStart && start < bookedEnd) ||
        (end > bookedStart && end <= bookedEnd) ||
        (bookedStart >= start && bookedStart < end));
    return {
      slot: `${start}-${end}`,
      isBooked
    };
  })



console.log(avail(ts, room1));
代码语言:javascript
复制
.as-console-wrapper {
  min-height: 100%
}

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-26 05:59:37

我已尽力使它行得通。请检查这是否符合您的要求。

代码语言:javascript
复制
const ts = ['10:00-10:30','10:30-11:00','11:00-11:30','11:30-12:00','12:00-12:30','12:30-13:00','13:00-13:30','13:30-14:00','14:00-14:30','14:30-15:00','15:00-15:30','15:30-16:00'];

let rooms = {"room100":["11:00-11:30", "13:05-13:35", "14:05-14:15"],"room200":[ "11:00-12:00",  "12:00-13:00", "13:00-14:00"],"room300":[ "12:00-13:00", "13:00-14:00", "14:00-15:00"]};
var final = [];
const avail = (ts, room) =>
	ts.map(item => {
		const[start, end] = item.split('-');
    let slot = [];
    
  for(var key in room)
        {
    	let avilable = room[key]
			.map(item => item.split('-'))
			.some(([bookedStart, bookedEnd]) =>
				(start >= bookedStart && start < bookedEnd) ||
				(end > bookedStart && end <= bookedEnd) ||
				(bookedStart >= start && bookedStart < end));
       slot = avilable == false ? [...slot] : [...slot,key];
       console.log()
    }
    const isBooked = slot.length > 0 ? true :false;
    final.push({"slot":`${start}-${end}`, "available": isBooked, "space": slot })
    //console.log(`${start}-${end}`,isBooked, slot);
	})
  
avail(ts,rooms);

console.log(final)
代码语言:javascript
复制
.as-console-wrapper {min-height: 100%}

票数 4
EN

Stack Overflow用户

发布于 2019-07-26 06:39:52

您可以使用filterObject.entries (假设您有一个rooms对象)来完成这个任务。这样做的想法是,对于ts数组中的每一个时隙,您都希望找到(filter)具有该时隙中的可用性的房间。

我还建议将检查某个时间是否与某个时隙重叠的逻辑抽象为另一个函数,以便您可以单独测试它:

代码语言:javascript
复制
const ts = ['10:00-10:30','10:30-11:00','11:00-11:30','11:30-12:00','12:00-12:30','12:30-13:00','13:00-13:30','13:30-14:00','14:00-14:30','14:30-15:00','15:00-15:30','15:30-16:00'];
const rooms = {
  'room1': ["11:00-11:30", "13:05-13:35", "14:05-14:15"],
  'room2': [ "11:00-12:00",  "12:00-13:00", "13:00-14:00"],
  'room3': [ "12:00-13:00", "13:00-14:00", "14:00-15:00"]
};

const overlaps = (slot, booking) => {
  const [start, end] = slot.split('-');
  const [bookedStart, bookedEnd] = booking.split('-');
  return (start >= bookedStart && start < bookedEnd) ||
		 (end > bookedStart && end <= bookedEnd) ||
		 (bookedStart >= start && bookedStart < end);
};

const res = ts.map(slot => {
  const space = Object.entries(rooms)
    .filter(([_, availableSlots]) => availableSlots.some(roomSlot => overlaps(slot, roomSlot)))
    .map(([room, _]) => room);
  return {slot, space, available: space.length > 0};
});

console.log(res);

票数 2
EN

Stack Overflow用户

发布于 2019-07-26 06:45:26

您可以使用一些嵌套的迭代结构,并检查想要的插槽中是否有房间可用。

代码语言:javascript
复制
var slots = [ '10:00-11:00',
  '10:15-11:15',
  '10:30-11:30',
  '10:45-11:45',
  '11:00-12:00' ],
    rooms = { '5d396fd3f0315c3f56b255d4-5d396fe2f0315c3f56b25a79': [],
  '5d396fa0f0315c3f56b245d6': [ '11:00-12:00' ] },
    roomEntries = Object.entries(rooms),
    result = slots.map(slot => {
        var [sStart, sEnd] = slot.split('-'),
            space = roomEntries
                .filter(([room, a]) => a.some(available => {
                    var [aStart, aEnd] = available.split('-');
                    return (sStart >= aStart && sEnd <= aEnd || sStart <= aStart && sEnd > aStart || sStart < aEnd && sEnd >= aEnd);
                }))
                .map(([k]) => k);
        return { slot, available: !!space.length, space };
    });

console.log(result);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57213573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档