在javascript中具有条件的嵌套循环

我正在开发一个项目,我想创建一个名为full_day []的数组,在通过day_schedule()之后,它与数组time_plan []具有完全相等的长度.

这是我的代码:

function day_schedule(){

var time_plan = [{"lesson_start":"08:00","lesson_end":"09:00"},{"lesson_start":"09:00","lesson_end":"10:00"},{"lesson_start":"10:00","lesson_end":"11:00"},{"lesson_start":"11:00","lesson_end":"12:00"},{"lesson_start":"12:00","lesson_end":"13:00"},{"lesson_start":"13:00","lesson_end":"13:30"},{"lesson_start":"13:30","lesson_end":"14:30"}];

var day = [{"subject_name":"Math-1","lesson_start":"08:00","lesson_end":"09:00"},{"subject_name":"Phy","lesson_start":"11:00","lesson_end":"12:00"},{"subject_name":"Engl","lesson_start":"12:00","lesson_end":"13:00"}];

var key1 = 'lesson_start';
var key2 = 'lesson_end';
var full_day = [];


for (var d = 0; d < day.length; d++) {
                var start_time = day[d].lesson_start;
                var end_time = day[d].lesson_end;

                for (var i = 0; i < time_plan.length; i++) {
                        var search_key = time_plan[i][key1] == start_time && time_plan[i][key2] == end_time;
                        if (search_key == true) {
                            document.writeln('day matched == ' + day[d],'<br>');
                            full_day.push(day[d]);
                        } else {
                            full_day.push({ 
                                lesson_start: ' ',
                                lesson_end: ' ',
                                subject_name: ' '
                            });
                        }

                    }


                console.log('full day',full_day.length, full_day);


            }
}

day_schedule();

我期待着结果

full day 7 [
  {
    "subject_name": "Math-1",
    "lesson_start": "08:00",
    "lesson_end": "09:00"
  },
  {
    "lesson_start": " ",
    "lesson_end": " ",
    "subject_name": " "
  },
  {
    "lesson_start": " ",
    "lesson_end": " ",
    "subject_name": " "
  },
  {
    "subject_name": "Phy",
    "lesson_start": "11:00",
    "lesson_end": "12:00"
  },
  {
    "subject_name": "Engl",
    "lesson_start": "12:00",
    "lesson_end": "13:00"
  },
  {
    "lesson_start": " ",
    "lesson_end": " ",
    "subject_name": " "
  },
  {
    "lesson_start": " ",
    "lesson_end": " ",
    "subject_name": " "
  }
];

但我不知道该怎么做.

最佳答案 如果您希望full_day大小与time_plan匹配,那么迭代完全错误.

你在代码中所做的是在一天中迭代每个元素(3个元素),并且对于time_plan中的每个元素(7个元素),为这些元素中的每一个元素添加一个对象full_day.

所以你得到的是:

>在第一天将第7个元素添加到full_day(7个元素)
> Secon元素在一天中你将另外7个对象添加到full_day(14个元素)
>第三个元素,你再次添加7个对象到full_day(21个元素)

如果你想保留你使用的逻辑,我建议你反过来转动你的循环:

function day_schedule(){
    var time_plan = [{"lesson_start":"08:00","lesson_end":"09:00"},
                     {"lesson_start":"09:00","lesson_end":"10:00"},
                     {"lesson_start":"10:00","lesson_end":"11:00"},
                     {"lesson_start":"11:00","lesson_end":"12:00"},
                     {"lesson_start":"12:00","lesson_end":"13:00"},
                     {"lesson_start":"13:00","lesson_end":"13:30"},
                     {"lesson_start":"13:30","lesson_end":"14:30"}];

    var day =[{
                  "subject_name":"Math1",
                  "lesson_start":"08:00",
                  "lesson_end":"09:00"
              },
              {
                  "subject_name":"Phy",
                  "lesson_start":"11:00",
                  "lesson_end":"12:00"
              },
              {
                  "subject_name":"Engl",
                  "lesson_start":"12:00",
                  "lesson_end":"13:00"
    }];

    var key1 = 'lesson_start';
    var key2 = 'lesson_end';
    var full_day = [];

    for (var tp = 0; tp < time_plan.length; tp++) {
        var start_time = time_plan[tp].lesson_start;
        var end_time = time_plan[tp].lesson_end;
        var lesson = { 
            lesson_start: ' ',
            lesson_end: ' ',
            subject_name: ' '
        };
        for (var i = 0; i < day.length; i++) {
            var search_key = day[i][key1] == start_time && day[i][key2] == end_time;
            if (search_key == true) {
                lesson = day[i]
            }
        }
        full_day.push(lesson)
    }
    console.log('full day',full_day.length, full_day);
}

day_schedule();

如您所见,这给出了所需的输出.
现在,我们还可以修改代码以使其更漂亮并使用一些有用的JavaScript数组函数,如find()

function day_schedule(){
    var time_plan = [{"lesson_start":"08:00","lesson_end":"09:00"},
                     {"lesson_start":"09:00","lesson_end":"10:00"},
                     {"lesson_start":"10:00","lesson_end":"11:00"},
                     {"lesson_start":"11:00","lesson_end":"12:00"},
                     {"lesson_start":"12:00","lesson_end":"13:00"},
                     {"lesson_start":"13:00","lesson_end":"13:30"},
                     {"lesson_start":"13:30","lesson_end":"14:30"}
        ];
    var day =[{
                  "subject_name":"Math1",
                  "lesson_start":"08:00",
                  "lesson_end":"09:00"
              },
              {
                  "subject_name":"Phy",
                  "lesson_start":"11:00",
                  "lesson_end":"12:00"
              },
              {
                  "subject_name":"Engl",
                  "lesson_start":"12:00",
                  "lesson_end":"13:00"
        }];
    var full_day = [];

    // Use foreach instead of regular for when you iterate arrays
    for (tp in time_plan) {
        var plan = time_plan[tp]
        var start_time = plan.lesson_start;
        var end_time = plan.lesson_end;
        // Use this function to find a suitable lesson given start and end times
        var lesson = day.find(function(d) {
            var start_matches = d.lesson_start == start_time;
            var end_matches = d.lesson_end == end_time;
            var matches = start_matches && end_matches;
            return start_matches && end_matches;
        }) || { // ... or assing a default empty value
            lesson_start: ' ',
            lesson_end: ' ',
            subject_name: ' '
        };
        full_day.push(lesson)
    }
    console.log('full day',full_day.length, full_day);
}

day_schedule();

希望这可以帮助.

点赞