如何向getFullYear()传递日期?如何转换男性用户日期并统计?
解答:关于getFullYear()的使用及男性用户出生年份统计代码修正
咱们先逐个解决你的两个问题,再帮你修正那段有问题的统计代码:
一、如何向getFullYear()方法传递日期?
getFullYear()是Date对象的实例方法,不能直接单独调用——你得先把目标日期转换成Date实例,再调用这个方法来提取年份。传递日期的方式主要有几种:
- 传递日期字符串(符合ISO格式或浏览器支持的格式):
// 示例:从ISO日期字符串获取年份 const date = new Date('1995-12-17'); const year = date.getFullYear(); // 返回 1995 - 传递时间戳(毫秒数,从1970年1月1日00:00:00 UTC开始计算):
const timestamp = 819129600000; // 对应1995-12-17 const date = new Date(timestamp); const year = date.getFullYear(); // 返回 1995 - 传递年、月、日等参数(注意月份是0开始的,1月为0):
const date = new Date(1995, 11, 17); // 11代表12月 const year = date.getFullYear(); // 返回 1995
二、如何针对男性用户的日期,利用getFullYear()进行转换?
步骤很清晰:
- 先从用户列表里筛选出所有男性用户;
- 遍历这些男性用户的生日字段,把每个生日转换成
Date实例; - 调用
getFullYear()提取出生年份,得到男性用户的出生年份数组。
示例片段:
const maleUsers = users.filter(user => user.gender === 'male'); const maleBirthYears = maleUsers.map(user => new Date(user.birthday).getFullYear());
三、你的统计代码错误修正及解释
原代码存在几个关键错误,我帮你修正并逐行说明:
修正后的完整代码
// 假设你引入了lodash库(因为用到了_.has) import _ from 'lodash'; const getMenCountByYear = (users) => { // 1. 筛选出所有男性用户 const men = users.filter(user => user.gender === 'male'); // 2. 提取男性用户的出生年份(先转Date再调用getFullYear) const birthYears = men.map(user => new Date(user.birthday).getFullYear()); // 3. 用reduce统计各年份的男性用户数量,初始值为空对象 const userByYear = birthYears.reduce((acc, year) => { // 检查累加器中是否已有该年份的键 if (_.has(acc, year)) { acc[year] += 1; // 已有则数量+1 } else { acc[year] = 1; // 没有则初始化为1 } return acc; }, {}); return userByYear; }; // 调用示例(假设users是你的用户数组) // console.log(getMenCountByYear(users)); // 导出函数本身,而不是调用后的结果 export default getMenCountByYear;
原代码的错误点说明
- 筛选后未使用男性用户列表:原代码筛选出
men后,map却用了原始的users,导致处理了所有用户而非仅男性; - 错误地对数组调用getFullYear():
years是Date对象数组,不能直接调用getFullYear(),应该在map阶段就提取年份; - reduce初始值错误:统计键值对应该用空对象
{},而非数组[]; - _.has参数顺序颠倒:正确的用法是
_.has(对象, 键名),原代码写成了_.has(year, acc); - 累加语法错误:
acc[year] =+ 1会把值设为1,正确的累加应该是acc[year] += 1; - return位置错误:原代码提前返回了
dates函数,导致后面的reduce逻辑根本不会执行; - 导出错误:应该导出函数本身,而非调用函数后的结果。
内容的提问来源于stack exchange,提问作者Alla Max
相关产品推荐
相关产品推荐

