ES5环境下实现时间段内对象占比100%无缺口校验
业务需求
给定起始日期、结束日期,以及按起始日期从早到晚排序的对象列表,需完成以下规则校验:
- 规则1:除列表最后一个对象的结束日期可留空(空值代表结束时间延伸至无穷远)外,其余所有对象的结束日期必须赋值,否则校验不通过。
- 规则2:给定的起止日期范围内,对象覆盖的日期不能存在缺口,否则返回false。示例:起止日期为2021-01至2021-05,若对象仅覆盖2021-04至2021-05区间,则2021-03存在缺口,需返回false。
- 规则3:任意日期区间内所有对象的percent值总和必须为100%,否则返回false。示例:某对象在对应区间占比为50%,则必须存在另一个相同起止日期的对象覆盖剩余50%。
运行环境限制
仅支持ES5语法,不兼容更高版本JS语法。
现有基础代码框架
// 对象列表示例,允许为空 var list = [ {'percent':'100', 'start':'2021-01', 'end':'2021-02'}, // A {'percent':'100', 'start':'2021-02', 'end':'2021-03'}, // B {'percent':'100', 'start':'2021-03', 'end':'2021-05'} // C ] function hasHundredAcrossDates(sd, ed, list) { if (list.length == 0) { // 给定日期区间必须有对应覆盖对象,空列表直接返回false return false; } if (sd != list[0].start) { // 列表首个对象起始时间必须和传入起始时间一致 return false; } var p = 0; var start = ''; var end = ''; for (var key in list) { // 待实现核心校验逻辑 } }
核心校验逻辑实现步骤
- 前置合法性校验
- 遍历列表的前
list.length - 1个对象,只要存在任意一个对象的end值为空,直接返回false。 - 写简易日期比较工具函数,由于入参日期为
YYYY-MM格式,直接通过字符串对比即可判断先后:function compareDate(d1, d2) { return d1.localeCompare(d2); }
- 同区间percent总和校验
- 遍历原列表,将
start和end完全相同的对象归为同一组,每组累加所有对象的percent值(注意要先转成数字类型,避免字符串拼接问题),只要任意一组的总和不等于100,直接返回false。
- 日期连续性校验
- 提取分组后的区间列表,按原顺序校验相邻区间的衔接性:前一个区间的
end必须等于后一个区间的start,只要不相等就存在日期缺口,直接返回false。 - 校验最后一个区间的覆盖范围:如果最后一个区间的
end不为空,需要判断该值 >= 传入的结束日期ed;如果最后一个区间的end为空,符合延伸至无穷远的规则,无需额外判断。
- 所有校验全部通过后,返回true。
内容的提问来源于stack exchange,提问作者Stacking
相关产品推荐
相关产品推荐

