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
尝试的思路与伪代码
思路
- 遍历所有现有Tab,获取每个Tab的日期集合
- 与服务器返回的日期对比,判断是否存在重叠
- 忽略无日期或与返回日期无重叠的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
相关产品推荐
相关产品推荐

