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

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) {
        // 待实现核心校验逻辑
    }
}
核心校验逻辑实现步骤
  1. 前置合法性校验
  • 遍历列表的前list.length - 1个对象,只要存在任意一个对象的end值为空,直接返回false。
  • 写简易日期比较工具函数,由于入参日期为YYYY-MM格式,直接通过字符串对比即可判断先后:
    function compareDate(d1, d2) {
        return d1.localeCompare(d2);
    }
    
  1. 同区间percent总和校验
  • 遍历原列表,将start和end完全相同的对象归为同一组,每组累加所有对象的percent值(注意要先转成数字类型,避免字符串拼接问题),只要任意一组的总和不等于100,直接返回false。
  1. 日期连续性校验
  • 提取分组后的区间列表,按原顺序校验相邻区间的衔接性:前一个区间的end必须等于后一个区间的start,只要不相等就存在日期缺口,直接返回false。
  • 校验最后一个区间的覆盖范围:如果最后一个区间的end不为空,需要判断该值 >= 传入的结束日期ed;如果最后一个区间的end为空,符合延伸至无穷远的规则,无需额外判断。
  1. 所有校验全部通过后,返回true。

内容的提问来源于stack exchange,提问作者Stacking

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 01:54:08