【问题标题】:Group simple array of dates "yyyy-mm-dd" by week and month in JavaScript在 JavaScript 中按周和月对简单的日期数组“yyyy-mm-dd”进行分组
【发布时间】:2017-01-11 06:30:06
【问题描述】:

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

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

"timeline_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"
]

这就是让我感动的原因:我不确定是否有一种简单的方法可以循环遍历这个数组,并将项目简单地推入新数组,或者是否必须将日期设置为修改,并用类似的东西删除“-”:

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

显然,“-”必须被替换。

希望有更简单的方法。

【问题讨论】:

  • 预期的输出结构是什么?
  • 按周分组的日期数组和按月分组的日期数组相同。所以它可能是一个数组数组。
  • 您可能需要确定每个日期属于一年中的哪一周(请参阅Get week of year in JavaScript like in PHP),然后按此分组。请小心解析日期字符串,“2016-12-20”将被解析为 UTC,因此根据您的时区,可能会延迟 1 天。使用图书馆。
  • 可以将周分组为 7 天的简单数组(数组数组)。没有搞笑的东西。只需计算确切月份的天数,然后按特定月份的数组分组。

标签: javascript arrays


【解决方案1】:

我会做类似以下的事情,希望 cmets 就足够了。可能有一种更时髦的方式来解决它,但这种方式对我来说相当清楚:

/* 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 函数借用自here

【讨论】:

  • 感谢您的精彩回答!这是一个很好的开始。按月分组有什么建议吗?也许使用这篇文章中的一些东西:stackoverflow.com/questions/1184334/…
  • @onmyway — 按月分组只需要对 reduce 函数稍作更改即可获得正确的分组值。您需要包括年份以避免重复。
猜你喜欢
  • 2013-06-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多