JavaScript如何通过变量动态访问对象属性 替代冗余if判断
问题说明
目前通过12个if语句判断月份来设置displayNames变量,想要找到更简洁的实现方式。
原有基础代码如下:
var dateToday = new Date(); var day = { day: "numeric" }; var dayToday = dateToday.toLocaleDateString("en", day); // 返回当日日期数字,比如13 var month = { month: "long" }; var monthToday = dateToday.toLocaleDateString("en", month); // 返回当月英文全称,比如July var displayNames = '';
导入的JSON数据data结构为:键为月份英文全称,值为按日期存储对应内容的数组,类似"July": [{'day' : '1', 'name' : 'something'}, ...]。
之前的冗余写法是为每个月份写单独的if判断:
if (monthToday == "July") { displayNames = data.July[dayToday].name; // 读取JSON中7月13日对应的name值 } // 其余11个月份均重复上述逻辑完全一致的if判断
尝试直接用变量访问属性时代码失效:
var displayNames = data.monthToday[dayToday].name; return .....
需要明确该写法失效的原因,以及如何通过月份变量动态获取对应数据,省略冗余的多分支判断。
失效原因
JavaScript对象属性访问的点语法(.)后接的是固定的属性名字面量,不会解析为变量。写data.monthToday时,代码会尝试查找data对象上键名**就叫monthToday**的属性,而不会读取你定义的monthToday变量中存储的"July"这类实际月份值,自然无法匹配到对应数据,触发取值错误。
简化实现方案
将点语法替换为方括号([])属性访问语法即可,方括号内支持传入变量,会自动解析变量值作为属性名查找:
// 注意:toLocaleDateString返回的日期是字符串类型,如果JSON中日期键为数字类型,需要做类型转换避免匹配失败 const dayKey = Number(dayToday); const displayNames = data[monthToday][dayKey].name;
如果要进一步精简日期获取逻辑,可以不用两次调用toLocaleDateString,一次调用即可拿到需要的两个值:
const dateToday = new Date(); // 一次格式化后拆分得到月份全称和日期 const [monthToday, dayToday] = dateToday .toLocaleDateString("en", { month: "long", day: "numeric" }) .split(" "); const displayNames = data[monthToday][Number(dayToday)].name;
内容的提问来源于stack exchange,提问作者Aigarito
相关产品推荐
相关产品推荐

