如何统计JSON日期数组中星期几的出现频率并找出TOPN?
解决日期数组中星期几频率统计问题
嘿,我来帮你搞定这个需求!你之前用的moment(@date field).week()其实是获取年份中的周数,不是星期几哦,这就是为啥没得到想要的结果~ 下面我一步步教你怎么统计给定日期数组里出现频率最高的前三星期几:
步骤1:处理输入的日期字符串
首先把你给出的空格分隔日期字符串转换成数组:
// 你的原始日期字符串 const dateString = "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 dateArray = dateString.split(' ');
步骤2:统计每个星期几的出现次数
用Moment.js获取每个日期对应的星期名称(比如"Thursday"),然后用对象计数:
const dayFrequency = {}; dateArray.forEach(date => { // 获取完整的星期名称(如"Thursday"),也可以用format('ddd')获取缩写(如"Thu") const dayName = moment(date).format('dddd'); // 更新计数:存在则+1,不存在则初始化为1 dayFrequency[dayName] = (dayFrequency[dayName] || 0) + 1; });
如果不想用Moment.js,原生JS也能实现,用toLocaleDateString获取星期名称:
const dayName = new Date(date).toLocaleDateString('en-US', { weekday: 'long' });
步骤3:排序并取前三
把计数对象转换成数组,按出现次数降序排序,再截取前三个:
// 转换为[{ day: '星期几', count: 次数 }]格式的数组 const sortedDays = Object.entries(dayFrequency) .map(([day, count]) => ({ day, count })) // 按次数从高到低排序 .sort((a, b) => b.count - a.count); // 获取频率最高的前三 const topThreeDays = sortedDays.slice(0, 3); console.log('出现频率前三的星期几:', topThreeDays);
测试你的示例数据
用你给的日期测试,结果会是:
[ { day: 'Thursday', count: 3 }, // 2018-04-19是周四 { day: 'Wednesday', count: 3 }, // 2018-05-02是周三 { day: 'Friday', count: 1 }, // 2018-04-20是周五 { day: 'Monday', count: 1 } // 2018-04-24是周一 ]
所以前三就是周四、周三、周五(如果次数相同,排序后会按原顺序排列,你也可以根据星期几的顺序再调整排序规则)。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

