修改JavaScript循环获取Google Calendar中火箭的下一个发射事件
解决方案:保留火箭最早的未发生发射事件
问题核心
当前代码遍历所有发射事件时,会用后续同火箭的事件日期覆盖之前的记录,导致arrElements中最终存储的是该火箭最后一个事件的日期。而Google Calendar API返回的事件已经通过orderBy: 'startTime'按时间升序排序,只需利用这一特性,确保每个火箭只保留第一个匹配的事件日期即可。
修改代码
只需修改setEventDate函数,添加仅当火箭未设置日期时才赋值的判断:
function setEventDate(eventname, eventdate) { for (var i = 0; i < arrElements.length; i++) { // 仅当火箭未设置日期且事件名称匹配时,才更新日期 if (eventname.search(arrElements[i].name) !== -1 && arrElements[i].eventdate === "") { arrElements[i].eventdate = eventdate; } } }
原理说明
API返回的事件是按时间从早到晚排序的,遍历事件时,第一个匹配到对应火箭的事件就是它的下一个即将到来的发射。添加arrElements[i].eventdate === ""的判断后,该火箭的日期被设置一次后,后续同火箭的事件不会再覆盖这个值,从而保留最早的未发生事件日期。
完整修改后的相关代码片段
var arrElements = [ { "name": "Electron", "eventdate": "" }, { "name": "Falcon 9 B5", "eventdate": "" }, { "name": "New Shepard", "eventdate": "" }, { "name": "SpaceShipTwo", "eventdate": "" }, { "name": "Gaofen 14", "eventdate": "" } ]; function setAllEvenDates(arrEvents) { for (var i = 0; i < arrEvents.length; i++) { setEventDate(arrEvents[i].name, arrEvents[i].eventdate); } } function setEventDate(eventname, eventdate) { for (var i = 0; i < arrElements.length; i++) { if (eventname.search(arrElements[i].name) !== -1 && arrElements[i].eventdate === "") { arrElements[i].eventdate = eventdate; } } }
内容的提问来源于stack exchange,提问作者Cesare Mannino
相关产品推荐
相关产品推荐

