组合简单的日期数组" yyyy-mm-dd"在JavaScript中按周和月

时间:2017-01-11 06:30:06

标签: javascript arrays

我想按周和月(在数组中)对一个简单的日期数组进行分组。我知道有很多例子,问题已被多次询问,但我找不到一个非常简单的日期格式的例子,而不是日期时间戳。

我的日期数据数组如下所示:

" timeline_data":[ "二○一六年十二月二十〇日&#34 ;, " 2016年12月21日&#34 ;, " 2016年12月22日&#34 ;, " 2016年12月23日&#34 ;, " 2016年12月24日&#34 ;, " 2016年12月25日&#34 ;, " 2016年12月26日&#34 ;, " 2016年12月27日&#34 ;, " 2016年12月28日&#34 ;, " 2016年12月29日&#34 ;, "二零一六年十二月三十○日&#34 ;, " 2016年12月31日&#34 ;, " 2017年1月1日&#34 ;, " 2017年1月2日&#34 ;, " 2017年1月3日&#34 ;, " 2017年1月4日&#34 ;, " 2017年1月5日&#34 ;, " 2017年1月6日&#34 ;, " 2017年1月7日&#34 ;, " 2017年1月8日&#34 ;, " 2017年1月9日&#34 ;, " 2017年1月10日" ],

这就是我的意思:我不确定是否有一种简单的方法可以循环遍历这个数组,并简单地将项目推送到新的数组,或者日期是否必须是修改了," - "删除类似:

var date="2016-12-20";
var newDate = date.replace(/-/g, "");

然后显然," - "将不得不被替换。

我希望有一种更简单的方法。

1 个答案:

答案 0 :(得分:2)

我会做类似以下的事情,希望评论足够。可能有一种更有趣的方式,但这种方式对我来说相当清楚:



/* Helper to get the ISO week number of a date
** @param {Date} date to get week of
** @returns {Array} [year, weekNumber]
*/
function getWeekNumber(d) {
  d = new Date(+d);
  d.setHours(0,0,0,0);
  d.setDate(d.getDate() + 4 - (d.getDay()||7));
  var yearStart = new Date(d.getFullYear(),0,1);
  var weekNo = Math.ceil(( ( (d - yearStart) / 86400000) + 1)/7);
  return [d.getFullYear(), weekNo];
}

/* Parse ISO 8601 format date string to local date
** @param {string} s - string to parse like 2016-12-15
** @returns {Date}
*/
function parseISOLocal(s) {
  var b = s.split(/\D/);
  return new Date(b[0],b[1]-1,b[2]);
}

var data = [ "2016-12-20", "2016-12-21", "2016-12-22", "2016-12-23", "2016-12-24", "2016-12-25", "2016-12-26", "2016-12-27", "2016-12-28", "2016-12-29", "2016-12-30", "2016-12-31", "2017-01-01", "2017-01-02", "2017-01-03", "2017-01-04", "2017-01-05", "2017-01-06", "2017-01-07", "2017-01-08", "2017-01-09", "2017-01-10"];

// Prepend year and week number to dates, e.g. "201651:2016-12-20", then sort
var arr = data.map(function(s){
  var week = getWeekNumber(parseISOLocal(s));
  return week[0] + ('0' + week[1]).slice(-2) + ':' + s;
}).sort();

// Group in arrays by week in an object
var groupedObj = arr.reduce(function (result, value) {
  var b = value.split(':');
  if (!result[b[0]]) result[b[0]] = [];
  result[b[0]].push(b[1]);
  return result;
},{});

// Grab arrays in order of week number. Sort keys to maintain order
var groupedArray = Object.keys(groupedObj).sort().map(key=>groupedObj[key]);

// Final set of grouped dates
console.log(groupedArray.join('\n\n'))




getWeekNumber 函数来自doc