You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:45:34