javascript - js循环问题

查看:94
本文介绍了javascript - js循环问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

 var getYearAndMonth = function(star,end,weekObj){
        var _hash = [];
        var _week = weekObj.week || [0,1,2,3,4,5,6];
        var _map = ['周日','周一','周二','周三','周四','周五'];
        var myDate = {
            /**
             * 相差多少天,用法:DateDiff('2016-04-17','2016-04-13');
             */
            DateDiff: function (dateTime, dateTime2) {
                var timestamp  = Date.parse(dateTime);
                var timestamp1 = Date.parse(dateTime2);
                for(var j=0;j<_week.length;j++){
                    for(var i=timestamp;i<timestamp1 + 86400000;i+=86400000){
                        var _date = this.DateFormat(i,'YYYY-MM-DD');   // 获取所有日期
                        if(new Date(_date).getDay() == _week[j]){   // _week[j] 周几 
                            var _weeKey = _map[_week[j]];
                            _hash[_week[j]] = {
                                week : _weeKey
                            }
                        }
                    }
                }
                console.log(_hash);
                return _hash
            },
            /**
             * 日期格式化,用法:DateFormat(86400000, 'YYYY-MM-DD')
             */
            DateFormat: function (timestamp, format) {
                var Dates   = {};
                Dates.digit = function (num) {
                    return num < 10 ? '0' + (num | 0) : num;
                };
                Dates.parse = function (ymd, hms, format) {
                    ymd    = ymd.concat(hms);
                    format = format || (Dates.options ? Dates.options.format : config.format);
                    return format.replace(/YYYY|MM|DD|hh|mm|ss/g, function (str, index) {
                        ymd.index = ++ymd.index | 0;
                        return Dates.digit(ymd[ymd.index]);
                    });
                };
                var De      = new Date((timestamp | 0) ? function (tamp) {
                    return tamp < 86400000 ? ( +new Date + tamp * 86400000) : tamp;
                }(parseInt(timestamp)) : +new Date);
                return Dates.parse(
                        [De.getFullYear(), De.getMonth() + 1, De.getDate()],
                        [De.getHours(), De.getMinutes(), De.getSeconds()],
                        format
                );
            }
        };
       return myDate.DateDiff(star,end);
    };
    var dataWeekArr = this.getYearAndMonth('2016-05-10','2016-08-10', {
        week:[5,1,2]
    });

是想在 DateDiff里的最后返回的格式是这样的

_hash = {
    week : "周一",
    data: ['2016-01-02','2016-06-03']   // 这里的data数组 是所有的周一的日期 
}

这样的要在循环里怎么写啊 感觉就卡在这里了 不知道怎么写了 希望能得到人的解答 不胜感激

解决方案

我只把 DateDiff 的代码贴出来,其它的都没变,_hash 没用到,可以取消了。

方法一

先建了临时表,就是 _week 转换成表,键是表示星期几的数字,值是空数组,然后在循环里按 getDay() 取得的星期几从临时表里找到数组,push 日期。最后按临时表的KEY(星期几),找到对应的中文,用这个中文和表中对应的值(数组)重建一个表,就是结果。

reduce 都可以用 for 代替

DateDiff: function(dateTime, dateTime2) {
    var start = Date.parse(dateTime);
    var end = Date.parse(dateTime2) + 86400000;

    var tmap = _week.reduce(function(r, i) {
        r[i] = [];
        return r;
    }, {});

    for (var i = start; i < end; i += 86400000) {
        var week = new Date(i).getDay();
        (tmap[week] || []).push(this.DateFormat(i, "YYYY-MM-DD"));
    }

    return Object.keys(tmap).reduce(function(r, i) {
        r[_map[i]] = tmap[i];
        return r;
    }, {});
}

方法二

这个方法直接先把 _hash 按 _week 初始化每一项的空数组,然后在循环里通过 getDay() 的值找到对应的 _hash 的值(数组),把日期 push 进去。

DateDiff: function(dateTime, dateTime2) {
    var start = Date.parse(dateTime);
    var end = Date.parse(dateTime2) + 86400000;

    for (var i = 0; i < _week.length; i++) {
        _hash[_map[i]] = [];
    }

    for (var i = start; i < end; i += 86400000) {
        var week = new Date(i).getDay();
        (_hash[_map[week]] || []).push(this.DateFormat(i, "YYYY-MM-DD"));
    }

    return _hash;
}

这篇关于javascript - js循环问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆