JavaScript for嵌套循环

说明

嵌套循环,就是在外部循环内,还有内部循环,如下:

for(){  // 外部循环

    for(){  // 内部循环

    }

}

案例

使用嵌套循环,打印1-12月,并且打印每个月的日期,如下图:

难点:

  • 每行显示7天
  • 分大小月,大月的最后一天是31号,小月的最后一天是30号
  • 分闰年,闰年2月份的最后一天是29号,否则是28号

简单实现

打印1-12月,并且打印每个月的日期(假设每个月的最后一天是30号),如下图:


// 外部循环,是循环打印1-12月
for( var m = 1;m<=12;m++){
    console.log(m + "月")
    // 内部循环,循环打印1-30号
    for(var d = 1;d<=30;d++){
        console.log("\t",d+"日")
    }
}

进一步完善

打印1-12月,并且打印每个月的日期(假设每个月的最后一天是30号),每7天换行,如下图:

for( var m = 1;m<=12;m++){
    console.log(m + "月")
    // 内部循环,循环打印1-30号
    var line = "\t"
    for(var d = 1;d<=30;d++){
        // 拼接日期
        line = line + d + "\t"
        // 每7天做一次打印
        if(d%7 == 0){
            console.log(line)
            line = "\t"
        }
        // 到最后一天,将剩下的(不足7天的打印出来)
        if(d==30){
            console.log(line)
            line = "\t"
        }
    }
}

进一步完善

除了2月份,每个月的最后一天是真实的,如下图:

for( var m = 1;m<=12;m++){
    console.log(m + "月")
    // 内部循环,循环打印1-30号
    var line = "\t"

    /*
     * 判断每个月的后一天,
     * 如果是1月份,最后一天是31
     * 如果是2月份,最后一天是。。。
     * 如果是3月份,最后一天是31
     * 如果是4月份,最后一天是30
     * 如果是5月份,最后一天是31
     * 如果是6月份,最后一天是30
     * 如果是7月份,最后一天是31
     * 如果是8月份,最后一天是31
     * 如果是9月份,最后一天是30
     * 如果是10月份,最后一天是31
     * 如果是11月份,最后一天是30
     * 如果是12月份,最后一天是31
     */
    var lastDay = 31
    if(m == 4 || m == 6 || m == 9 || m == 11){
        lastDay = 30
    }else if(m == 2){ // 2月份,判断闰年
        lastDay = 28
    }else{
        lastDay = 31
    }

    for(var d = 1;d <= lastDay ;d++){
        // 拼接日期
        line = line + d + "\t"
        // 每7天做一次打印
        if(d%7 == 0){
            console.log(line)
            line = "\t"
        }
        // 到最后一天,将剩下的(不足7天的打印出来)
        if(d == lastDay){
            console.log(line)
            line = "\t"
        }
    }
}

处理闰年

判断闰年,闰年2月的最后一天是29号,否则是28号

var year = 2023
console.log(year+"年")
for( var m = 1;m<=12;m++){
    console.log(m + "月")
    // 内部循环,循环打印1-30号
    var line = "\t"

    /*
     * 判断每个月的后一天,
     * 如果是1月份,最后一天是31
     * 如果是2月份,最后一天是。。。
     * 如果是3月份,最后一天是31
     * 如果是4月份,最后一天是30
     * 如果是5月份,最后一天是31
     * 如果是6月份,最后一天是30
     * 如果是7月份,最后一天是31
     * 如果是8月份,最后一天是31
     * 如果是9月份,最后一天是30
     * 如果是10月份,最后一天是31
     * 如果是11月份,最后一天是30
     * 如果是12月份,最后一天是31
     */
    var lastDay = 31
    if(m == 4 || m == 6 || m == 9 || m == 11){
        lastDay = 30
    }else if(m == 2){ // 2月份,判断闰年
        // 判断闰年,是闰年那么最后一天是29号,否则是28号
//        lastDay = 28
        /*
         * 1. 4年一闰,百年不闰
         * 2. 400年再闰
         */
        if( ( year % 4 == 0 && year % 100 != 0 ) ||  year % 400 == 0 ){
            lastDay = 29
        }else{
            lastDay =28
        }
    }else{
        lastDay = 31
    }

    for(var d = 1;d <= lastDay ;d++){
        // 拼接日期
        line = line + d + "\t"
        // 每7天做一次打印
        if(d%7 == 0){
            console.log(line)
            line = "\t"
        }
        // 到最后一天,将剩下的(不足7天的打印出来)
        if(d == lastDay){
            console.log(line)
            line = "\t"
        }
    }
}

原文出处:/show_1IX6R1ZelbRv.html