如何遍历嵌套JSON数组查找指定event并按sent字段排序?
解析嵌套JSON并筛选最新天气预警的解决方案
问题分析
你的代码存在两个核心问题:
- 错误地将
features当作对象访问:json['features']['properties']['event'],实际上features是一个数组,必须通过索引遍历或数组方法处理。 - 仅读取数组第一个元素,无法遍历所有匹配
event的项,也没有按sent字段排序获取最新事件。
修正后的完整代码
if (input == 'Special Weather Statement') { var url = "https://api.weather.gov/alerts?zone=AKZ201"; var slide = SlidesApp.getActivePresentation().getSelection().getCurrentPage(); var res = UrlFetchApp.fetch(url); var content = res.getContentText(); var json = JSON.parse(content); Logger.log(json); // 1. 提取features数组并筛选匹配指定event的项 var filteredAlerts = json.features.filter(function(feature) { return feature.properties && feature.properties.event === input; }); // 2. 按sent字段降序排序,获取最新的预警 filteredAlerts.sort(function(a, b) { var dateA = new Date(a.properties.sent); var dateB = new Date(b.properties.sent); return dateB - dateA; // 降序排列,最新的在前 }); // 3. 处理筛选后的结果 if (filteredAlerts.length > 0) { var latestAlert = filteredAlerts[0]; var shape = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 20, 259, 420, 60); var textRange = shape.getText(); var description = latestAlert.properties.description.replaceAll('\n',' '); textRange.setText(description); textRange.getTextStyle().setFontSize(17).setForegroundColor('#ffffff').setFontFamily("Libre Franklin"); } else { // 没有匹配的预警时的处理逻辑 Logger.log("No matching Special Weather Statement found"); } }
关键代码说明
- 筛选匹配项:使用
Array.filter()遍历所有features,只保留properties.event等于输入值的项,同时增加feature.properties的存在性检查,避免空值报错。 - 按时间排序:使用
Array.sort()将筛选后的预警按sent时间戳降序排列,通过new Date()将字符串转换为日期对象进行比较,确保最新的预警排在数组首位。 - 结果处理:先判断筛选结果是否为空,再取第一个元素(最新预警)进行后续的幻灯片文本插入操作,避免无匹配时出现错误。
额外优化建议
- 可以将
input参数化,让代码支持任意事件类型的查询,而不仅仅是固定的'Special Weather Statement'。 - 若需要显示所有匹配的预警,可以遍历
filteredAlerts数组,逐个插入文本框到幻灯片中。
内容的提问来源于stack exchange,提问作者kait0216
相关产品推荐
相关产品推荐

