我试过了,但我不能提出条件.我想找个公共的位置.

  • 第一人称测试在上午10点到下午12点之间提供
  • 第二人称elton在上午9点到10点30分和10点30分之间可用 上午11点
  • 第三人肖恩在上午10:30至11:00之间有空

因此,公共插槽将为上午10:30至11:00

const input = [
  {
    email: 'test@test.com',
    range: [
      {start: '10:00:00', end: '12:00:00' }
    ],
  },
  {
    email: 'elton@test.com',
    range: [
      {start: '09:00:00', end: '10:30:00'},
      {start: '10:30:00', end: '11:00:00' }
    ],
  },
  {
    email: 'shawn@test.com',
    range: [
      {start: '10:30:00', end: '11:00:00' }
    ],
  },
];

输出:

 [
      {start: '10:30:00', end: '11:00:00' }
  ]

第二个输入示例

const input = [
  {
    email: 'test@test.com',
    range: [
      {start: '10:00:00', end: '12:00:00' }
    ],
  },
  {
    email: 'elton@test.com',
    range: [
      {start: '09:00:00', end: '10:30:00'},
      {start: '10:30:00', end: '11:00:00' },
      {start: '14:30:00', end: '15:00:00' }
    ],
  }
];

输出:

[
 {start: '10:00:00', end: '11:00:00' }
]

第三个输入示例:

const input = [
  {
    email: 'test@test.com',
    range: [
      {start: '10:00:00', end: '12:00:00' },
      {start: '14:30:00', end: '15:00:00' }
    ],
  },
  {
    email: 'elton@test.com',
    range: [
      {start: '09:00:00', end: '10:30:00'},
      {start: '10:30:00', end: '11:00:00' },
      {start: '14:30:00', end: '15:00:00' }
    ],
  }
];

输出:

[
 {start: '10:00:00', end: '11:00:00' },
 {start: '14:30:00', end: '15:00:00' }
]

到目前为止我已经try 过的代码

function generateIntersectSlot(interviewerRange) {
  if (!interviewerRange.length) {
    return [];
  }
  for (let interviewer of interviewerRange) {
    for (let nextInterviewer of interviewerRange) {
      if (interviewer.email == nextInterviewer.email) {
        continue;
      }
      console.log(interviewer.email, 'interviewerSlot email')
      console.log(nextInterviewer.email, 'nextInterviewer email')
      const interviewerSlot = interviewer.range;
      const nextInterviewerSlot = nextInterviewer.range;
      for (let intSlot of interviewerSlot) {
        for (let nextIntSlot of nextInterviewerSlot) {

          console.log(intSlot, 'intSlot')
          console.log(nextIntSlot, 'nextIntSlot')
          // if(new Date(`${getDate}T${intSlot.start}`) >= new Date(`${getDate}T${nextIntSlot.start}`) ) {
          //   console.log(intSlot, 'asd')
          // } else {

          // } 


        }
      }
    }
  }
}

generateIntersectSlot(input);
<script>
  const input = [{
      email: 'test@test.com',
      range: [{
        start: '10:00:00',
        end: '12:00:00'
      }],
    },
    {
      email: 'elton@test.com',
      range: [{
          start: '09:00:00',
          end: '10:30:00'
        },
        {
          start: '10:30:00',
          end: '11:00:00'
        }
      ],
    },
    {
      email: 'shawn@test.com',
      range: [{
        start: '10:30:00',
        end: '11:00:00'
      }],
    },
  ];
</script>

推荐答案

我们需要实现相交和联合范围的函数,然后我们需要循环Person和Range,找到交叉点,然后合并属于一起的交叉点:

function max(first, second) {
    return (first > second) ? first : second;
}

function min(first, second) {
    return (first < second) ? first : second;
}

function merge(overlap, newOne) {
    for (let index = 0; index < overlap.length; index++) {
        let res = union(overlap[index], newOne);
        if (res) {
            overlap[index] = res;
            return;
        }
    }
    overlap.push(newOne);
}

function intersect(first, second) {
    if ((first.start > second.end) || (second.start > first.end)) {
        return null;
    }
    return {start: max(first.start, second.start), end: min(first.end, second.end)}
}

function union(first, second) {
    if ((first.start > second.end) || (second.start > first.end)) {
        return null;
    }
    return {start: min(first.start, second.start), end: max(first.end, second.end)}
}

function getOverlaps(persons) {
    let overlaps = persons[0].range;
    for (let i = 1; i < persons.length; i++) {
        let newOverlaps = [];
        for (let o of overlaps) {
            for (let o2 of persons[i].range) {
                let intersection = intersect(o, o2);
                if (intersection) {
                    merge(newOverlaps, intersection);
                }
            }
        }
        if (newOverlaps.length === 0) return [];
        overlaps = newOverlaps;
    }
    return overlaps;
}

const input = [
[
  {
    email: 'test@test.com',
    range: [
      {start: '10:00:00', end: '12:00:00' }
    ],
  },
  {
    email: 'elton@test.com',
    range: [
      {start: '09:00:00', end: '10:30:00'},
      {start: '10:30:00', end: '11:00:00' }
    ],
  },
  {
    email: 'shawn@test.com',
    range: [
      {start: '10:30:00', end: '11:00:00' }
    ],
  },
],
[
  {
    email: 'test@test.com',
    range: [
      {start: '10:00:00', end: '12:00:00' }
    ],
  },
  {
    email: 'elton@test.com',
    range: [
      {start: '09:00:00', end: '10:30:00'},
      {start: '10:30:00', end: '11:00:00' },
      {start: '14:30:00', end: '15:00:00' }
    ],
  }
],
 [ 
   {
     email: 'test@test.com',
     range: [
       {start: '10:00:00', end: '12:00:00' },
       {start: '14:30:00', end: '15:00:00' }
     ],
   },
   {
     email: 'elton@test.com',
     range: [
       {start: '09:00:00', end: '10:30:00'},
       {start: '10:30:00', end: '11:00:00' },
       {start: '14:30:00', end: '15:00:00' }
     ],
   }
 ]
];

console.log(getOverlaps(input[0]));
console.log(getOverlaps(input[1]));
console.log(getOverlaps(input[2]));

Javascript相关问答推荐

如何在NightWatch.js测试中允许浏览器权限?

使用print This时, map 容器已在LeafletJS中初始化

有条件的悲剧

WebRTC关闭navigator. getUserMedia正确

Chromium会将URL与JS一起传递到V8吗?

你怎么看啦啦队的回应?

我怎么才能得到Kotlin的密文?

Html文件和客户端存储的相关问题,有没有可能?

如何在coCos2d-x中更正此错误

如何修复我的数据表,以使stateSave正常工作?

在我的index.html页面上找不到我的Java脚本条形图

与svg相反;S getPointAtLength(D)-我想要getLengthAtPoint(x,y)

图表4-堆叠线和条形图之间的填充区域

使用RxJS from Event和@ViewChild vs KeyUp事件和RxJS主题更改输入字段值

用于部分字符串的JavaScript数组搜索

React Refs不与高阶组件(HOC)中的动态生成组件一起工作

是否设置以JavaScript为背景的画布元素?

TabNavigator和StackNavigator之间的Reaction Native中的导航问题

如何在Reaction中设置缺省值, Select 下拉列表,动态追加剩余值?

当一条路由在Reaction路由中命中时,如何有条件地渲染两个组件或更改两个插座?