2对象之间的比较

时间:2018-02-24 12:58:30

标签: javascript

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

已经注册的课程对象:

{"00001":{"days":"Monday-Tuesday","hours":"11:40-12:30*13:40-15:30"}}

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

注册对象的课程:

{"00003":{"days":"Friday","hours":"9:40-10:40"}}

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

Object.keys(registeredcoursesobject).forEach(function(key){
    if( Object.keys(coursestoregisterobject).includes(key)) {
      alert("You have already registered to "+key+" crn number course");

      //return;
    }
  });

一个课程一周最多可以是2天,并且可以在1个不同的时间间隔内(如果2个时间间隔??),这意味着只有一个" - "在天属性和只有一个" *"小时财产。 我是编程的新手,并且在这几天有任何想法吗?

1 个答案:

答案 0 :(得分:0)

我希望这个答案对你来说仍然有用。这就是我所拥有的:

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;
    });
});

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

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

相关问题