【问题标题】:How to find the most day of the week?如何找到一周中最多的一天?
【发布时间】:2018-05-29 09:36:58
【问题描述】:

我有一个日期数组,如何找到一周中最常见的/第二/第三天? 我已经尝试了以下

moment(@date field).week() 

但是一个 json 日期数组呢?

2018-04-19
2018-04-19
2018-04-19
2018-04-20
2018-04-24
2018-05-02
2018-05-02
2018-05-02

【问题讨论】:

  • 你可以这样做const res = dates .map(v => v.split('-')) .reduce((acc, v) => { const idx = parseInt(v[1]); acc[idx] ? acc[idx] += 1 : acc[idx] = 1; return acc; }, []) .map((v, idx) => [idx, v]) .sort((a, b) => b[1] - a[1]); console.log(res);
  • 为什么这个问题被关闭并被否决?老实说,我不明白,在我看来,所指出的问题也具有误导性,这里的 OP 正在使用 moment 库,因此它不需要获取星期几,它只想拥有一周的年份数组中的一组日期,基本上按相关性排序。
  • 我同意,问题是按频率对星期几进行排序
  • 这不是由 OP 决定的吗?在重新打开之前,他似乎对副本很满意?
  • @David 是您所追求的答案,或者您是否希望将星期几作为字符串作为重复答案的含义?

标签: javascript arrays json


【解决方案1】:

有关详细信息,请参阅MapDate.prototype.getDay()Spread SyntaxArray.prototype.sort()Destructured AssignmentArray.prototype.map()

// Input.
const dates = ['2018-04-19','2018-04-19','2018-04-19','2018-04-20','2018-04-24','2018-05-02','2018-05-02','2018-05-02']
const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']

// Occurences.
const occurrences = dates => [...dates.reduce((m, date) => {
  const day = days[new Date(date).getDay()]
  m.set(day, (m.get(day) || 0) + 1)
  return m
}, new Map)].sort((A, B) => B[1] - A[1])

// Output
const output = occurrences(dates)

// Proof.
console.log('With Counts', output)
console.log('Without Counts', output.map(([day]) => day))

【讨论】:

  • Date.prototype.getDay() 范围从 0 = Sunday6 = Saturday。见上文output w/counts ? @DominicTobias
  • @ArmanCharan 我建议你对这个问题投赞成票,以帮助解决不合理的反对意见
【解决方案2】:
  1. 获取星期几
  2. 按频率排序(删除重复项)
  3. 将它们转换为工作日字符串(您也可以使用 moment 或 Intl.DateTimeFormat 进行此操作)

const dates = [
  '2018-04-19',
  '2018-04-19',
  '2018-04-19',
  '2018-04-20',
  '2018-04-24',
  '2018-05-02',
  '2018-05-02',
  '2018-05-02',
];

const daysOfWeek = dates.map(date => new Date(date).getDay());

// Now we have the days as numbers we can sort by frequency
// This function is from a google search: https://stackoverflow.com/a/3579651/414062
function sortByFrequency(array) {
  const frequency = {};

  array.forEach(value => frequency[value] = 0);
  const uniques = array.filter(value => ++frequency[value] == 1);
  return uniques.sort((a, b) => frequency[b] - frequency[a]);
}

const sortedDaysOfWeek = sortByFrequency(daysOfWeek);

// Now translate to weekday values
const weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
const weekdaysByFrequency = sortedDaysOfWeek.map(day => weekdays[day - 1]);

console.log(weekdaysByFrequency);

【讨论】:

  • 好的,已经解决了
  • 重复的是如何将星期几作为字符串获取,这个问题是按最常见的情况对星期几进行排序。如果 OP 确实完全打错了问题,请告诉我,我们可以再次将其标记为重复 @David
  • 也许 OP 被欺负而将其从反对票中关闭?但事实是我没有看到是 OP 关闭了它,所以我很高兴再次关闭它,等待他的回应
  • 我以为这是一个重复的问题,我错了
  • 谢谢你们的指导。我的问题已经解决了!
猜你喜欢
  • 2019-06-06
  • 1970-01-01
  • 2014-03-08
  • 2011-06-14
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
相关资源
最近更新 更多