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数组 是所有的周一的日期 
}

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

阅读 3.2k
2 个回答

我只把 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;
}

试试吧


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]];
                        if (!_hash[_weeKey]) {
                            _hash[_weeKey] = [];
                        }
                        _hash[_weeKey].push(_date);
                    }
                }
            }
            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 = getYearAndMonth('2016-08-01', '2016-08-10', {week: [0]});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题