
本文介绍如何基于 estimated_stay_time 字段,以指定阈值(如 100000)为最大允许增量,对有序数据进行前向动态分组——即仅允许向后合并、禁止回溯调整,确保每组内相邻项的增量不超过阈值且严格维持 detected_time 原序。
本文介绍如何基于 `estimated_stay_time` 字段,以指定阈值(如 100000)为最大允许增量,对有序数据进行**前向动态分组**——即仅允许向后合并、禁止回溯调整,确保每组内相邻项的增量不超过阈值且严格维持 `detected_time` 原序。
在实际业务场景中(例如物联网设备停留时长聚类、用户行为会话切分),我们常需将时间序列数据按“变化幅度”而非绝对值分组:要求后续元素与前一元素的差值 ≤ 某阈值(如 extension_window),否则开启新组。关键约束是:必须保持原始顺序,且分组逻辑是单向递进的(forward-only)——不能因后续值回落而将已分组项重新归并。
以下是一个健壮、可复用的实现方案,使用 Array.prototype.reduce() 进行一次遍历完成分组:
const data = [
{ detected_time: 1, estimated_stay_time: 300, extension_window: 100000 },
{ detected_time: 2, estimated_stay_time: 330000, extension_window: 100000 },
{ detected_time: 3, estimated_stay_time: 130000, extension_window: 100000 },
{ detected_time: 4, estimated_stay_time: 150000, extension_window: 100000 },
{ detected_time: 5, estimated_stay_time: 3000, extension_window: 100000 },
{ detected_time: 6, estimated_stay_time: 591988, extension_window: 100000 },
{ detected_time: 7, estimated_stay_time: 663913, extension_window: 100000 }
];
const groupByIncrementThreshold = (arr, thresholdKey = 'extension_window') => {
return arr.reduce((groups, item, index, array) => {
// 计算与前一项的增量(首项无前项,delta 设为 Infinity 触发新组)
const prevItem = array[index - 1];
const delta = item.estimated_stay_time - (prevItem?.estimated_stay_time ?? 0);
// 触发新组的条件:首项 / 增量为负(异常下降)/ 增量超过当前项的 extension_window
if (index === 0 || delta < 0 || delta > item[thresholdKey]) {
groups.push([item]);
} else {
// 向最后一组追加(前向合并)
groups.at(-1).push(item);
}
return groups;
}, []);
};
// 执行分组
const result = groupByIncrementThreshold(data);
console.log(result);✅ 输出结果完全匹配预期:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 第1组:[ {detected_time:1, ...} ](首项,独立成组)
- 第2组:[ {detected_time:2, ...} ](330000 − 300 = 329700 > 100000 → 超阈值)
- 第3–4组:[ {3}, {4} ](150000 − 130000 = 20000 ≤ 100000 → 合并)
- 第5组:[ {5} ](3000 − 150000 = −147000 < 0 → 下降,强制新组)
- 第6–7组:[ {6}, {7} ](663913 − 591988 = 71925 ≤ 100000 → 合并)
⚠️ 重要注意事项:
- 该算法依赖输入数组已按 detected_time 严格升序排列;若顺序混乱,结果不可靠;
- extension_window 是每个对象独立的阈值,支持差异化容错(如示例中所有项均为 100000,但设计上可扩展);
- 使用 groups.at(-1) 而非 groups[groups.length - 1] 提升可读性(现代 JS 环境兼容);
- 若需支持旧环境(如 IE),可替换为 groups[groups.length - 1];
- 不建议直接修改原数组,本实现为纯函数式,返回全新嵌套结构。
此方法时间复杂度为 O(n),空间复杂度为 O(n),兼顾性能与可维护性,适用于实时流处理或前端大规模列表分组场景。

















