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

EXTJS中重叠日期的合并与拆分逻辑实现问题求助

EXTJS Tab Panel日期重叠处理方案需求

系统背景

我们的EXTJS系统包含Tab Panel,每个Tab内有数据Grid,支持拖拽操作:拖拽含日期列表的对象时,会动态创建Tab并填充对应日期的Grid数据(比如拖拽含日期1/9的对象,会创建标题为1/9的Tab并加载对应数据)。

服务器返回的日期格式

每次拖拽后,服务器返回的日期数据有三种形式:

  • 类型1:单日期数组,如[1/8,1/9](无嵌套,对应一个Tab)
  • 类型2:嵌套日期数组,如[[1/8],[1/9]](每个子数组对应一个独立Tab)
  • 组合类型:混合单日期与嵌套数组,如[1/5, [1/6, 1/7], 1/8](对应3个Tab)

当前处理逻辑

遍历服务器返回的日期列表:

  • 若当前项是数组,将其拼接为“起始日期-结束日期”格式(如[1/6,1/7]对应标题1/6 - 1/7)
  • 为列表中的每个项创建一个Tab(组合类型会生成3个Tab)

核心问题与处理规则

拖拽前可能已存在带日期的Tab,需根据以下规则处理日期重叠的情况,忽略服务器返回的非重叠日期:

示例1

现有Tab日期范围:[1/5,1/6,1/7,1/8,1/9]
服务器返回:[[1/8],[1/9]]
处理结果:修改原Tab标题为1/5 - 1/8,并新建对应1/9的Tab

原因:无现有Tab时,该返回格式会生成2个Tab,因此需拆分原Tab的重叠日期部分

示例2

现有Tab日期范围:[1/5,1/6,1/7,1/8,1/9]
服务器返回:[1/8,1/9]
处理结果:保留原Tab,日期范围仍为1/5 - 1/9

原因:该返回格式对应单个Tab,且日期完全与现有Tab重叠,无需拆分或新增

示例3

现有Tab日期:[1/9]
服务器返回:[1/8,1/9] 或 [[1/8],[1/9]]
处理结果:保留原1/9的Tab,忽略非重叠的1/8

尝试的思路与伪代码

思路

  1. 遍历所有现有Tab,获取每个Tab的日期集合
  2. 与服务器返回的日期对比,判断是否存在重叠
  3. 忽略无日期或与返回日期无重叠的Tab

伪代码

const itemDates = content; // 服务器返回的日期数据

tabs.forEach(function(tab, index){
    let tabDates = tab.getDates();

    // 跳过无日期的Tab
    if(tabDates.length > 0) {
        // 根据索引获取服务器返回的对应日期项
        const currentItemDate = itemDates[index];

        // 索引越界时跳过
        if(currentItemDate){
            // 暂时忽略数组类型的返回项,认为其要么已存在于Tab中,要么是无重叠日期
            if(!Array.isArray(currentItemDate)){
                // 判断是否存在日期重叠
                if(tabDates.some(date => currentItemDate.includes(date))) {
                    // TODO: 处理重叠逻辑
                }
            }
        }
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 15:23:31