如何使用JavaScript访问API返回JSON对象的最后一个动态键
问题原因
JSONObject.timeline.cases[1]无法取到目标值,是因为timeline.cases是键值对结构的普通对象,不是数组。方括号索引仅支持按顺序下标读取数组元素,且不同解析环境对普通对象的键遍历顺序没有强制一致性保障,靠下标取对象值本身逻辑就不可靠。JSONObject.timeline.6/9/22不符合语法规范,是因为点操作符读取属性要求键名必须是合法标识符,不能以数字开头,也不能包含/这类特殊字符。- 硬编码日期键名的写法无法适配接口每日更新的规则,接口返回新日期后写死的键就会匹配不到数据。
正确实现方式
已知目标键名的写法
对于包含特殊字符、数字开头的键,统一使用方括号+字符串键名的语法读取属性即可,示例代码:
// 读取6/9/22对应的确诊数据 const targetCases = JSONObject.timeline.cases["6/9/22"] // 读取同日期的死亡、治愈数据 const targetDeaths = JSONObject.timeline.deaths["6/9/22"] const targetRecovered = JSONObject.timeline.recovered["6/9/22"]
动态键(不硬编码日期)的写法
如果需要适配接口每日更新的动态日期键,可以先读取对应对象下的全部键名,筛选出目标键后再取值,不需要硬编码固定日期,示例:
// 获取cases下所有日期键 const allDateKeys = Object.keys(JSONObject.timeline.cases) // 示例1:取最新日期对应的数据,先把日期转成时间戳排序,取最后一个即为最新 const sortedDateKeys = allDateKeys.sort((prev, next) => new Date(prev) - new Date(next)) const latestKey = sortedDateKeys.at(-1) const latestCases = JSONObject.timeline.cases[latestKey] // 示例2:按规则匹配目标键,不需要提前写死完整键名 const matchKey = allDateKeys.find(key => key === "6/9/22") const targetCases = matchKey ? JSONObject.timeline.cases[matchKey] : null
注意:不要尝试靠下标顺序读取普通对象的属性,不同JSON解析库的键遍历规则存在差异,很容易取到错误日期对应的数据。
内容的提问来源于stack exchange,提问作者Krishna Bisani
相关产品推荐
相关产品推荐

