首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个对象的比较

两个对象的比较
EN

Stack Overflow用户
提问于 2018-02-24 12:58:29
回答 1查看 68关注 0票数 0

我正在研究一个课程注册系统,我需要检查一下时间冲突。

已注册的课程目标:

代码语言:javascript
复制
{"00001":{"days":"Monday-Tuesday","hours":"11:40-12:30*13:40-15:30"}}

这意味着00001课程在星期一11:40-12:30在星期二13:40-15:30。

注册对象课程:

代码语言:javascript
复制
{"00003":{"days":"Friday","hours":"9:40-10:40"}}

我已设法检查是否已注册使用此代码的学生:

代码语言:javascript
复制
Object.keys(registeredcoursesobject).forEach(function(key){
    if( Object.keys(coursestoregisterobject).includes(key)) {
      alert("You have already registered to "+key+" crn number course");

      //return;
    }
  });

一个课程最多可以是一周两天,每隔一段不同的时间间隔(如果两个时间间隔呢?)这意味着只有一个"-“在天的财产和只有一个"*”在小时财产。我对编程很陌生,几天来一直致力于这个项目,有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-25 10:11:14

我希望这个答案仍然适用于你。以下是我所拥有的:

代码语言:javascript
复制
var registeredcoursesobject = {"00001":{"days":"Monday-Thursday","hours":"11:40-12:30*16:30-18:30"}}
var coursestoregisterobject = {"00002":{"days":"Monday-Friday","hours":"10:40-15:30*16:40-18:00"}}

var getTicks = function(timeStr) {
    return new Date('1970-01-01T' + timeStr + ':00Z').getTime();
}

Object.keys(registeredcoursesobject).forEach(function(rKey){
    if( Object.keys(coursestoregisterobject).includes(rKey)) {
        alert("You have already registered to "+rKey+" crn number course");
        return false;
    };
    Object.keys(coursestoregisterobject).forEach(function(cKey){
        var regDays = registeredcoursesobject[rKey].days.split('-');
        var regHours = registeredcoursesobject[rKey].hours.split('*');

        var courseDays = coursestoregisterobject[cKey].days.split('-');
        var courseHours = coursestoregisterobject[cKey].hours.split('*');

        regDays.forEach(function(rDay, i) {
            var rHourRange = regHours[i];

            // I assume you need to check there is same date/time pain in registeredcoursesobject and coursestoregisterobject
            courseDays.forEach(function(cDay, j) {
                if (rDay == cDay) {
                    var cHourRange = courseHours[j];
                    // now, do you need to compare hours be equal exactly or do you need to check time overlap?
                    // assume you just need to ckeck hour ranges are equal, then:
                    if (rHourRange == cHourRange){
                        // means equal
                        alert("You have already registered to "+cKey+" crn number course on day "+cDay+" at "+cHourRange+" hours.");
                        return true;
                    }

                    // if you need to check range overlap
                    var rTime = rHourRange.split('-');
                    rTimeRange = [getTicks(rTime[0]), getTicks(rTime[1])];
                    rStartT = Math.min.apply(null, rTimeRange), rEndT = Math.max.apply(null, rTimeRange);
                    var cTime = cHourRange.split('-');
                    cTimeRange = [getTicks(cTime[0]), getTicks(cTime[1])]
                    cStartT = Math.min.apply(null, cTimeRange), cEndT = Math.max.apply(null, cTimeRange);

                    // now your rangeTime is a pair of int values, that represent time range rStartT:rEndT
                    // and your courseTime is a pair of int values cStartT:cEndT
                    // so now you just check the overlap of two integer pais.
                    // according to this: https://stackoverflow.com/questions/3269434/whats-the-most-efficient-way-to-test-two-integer-ranges-for-overlap#answer-3269471
                    if (rStartT < cEndT && cStartT < rEndT) {
                        alert("You have already registered to "+cKey+" crn number course on day "+cDay+" within time range "+cHourRange+" hours overlap with "+rHourRange+" time range.");
                        // means time ranges are overlap at some range. But I don't count the border, like "14:00-15:00" and "15:00-16:00" do not overlap
                        // otherwise replace < with <=
                        return true;
                    }
                }
            })
        });
        return false;
    });
});

我在这里对你的任务做了一些假设。

更新:添加了时间范围检查。更新:首先检查键相等,如果由于某种原因开始时间大于结束时间,则值交换。

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

https://stackoverflow.com/questions/48963141

复制
相关文章

相似问题

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