
本文介绍如何基于 estimated_stay_time 字段对对象数组进行有序区间分组(每组内相邻项差值 ≤ extension_window),同时严格保留 detected_time 的原始顺序,避免回溯合并。
本文介绍如何基于 `estimated_stay_time` 字段对对象数组进行**有序区间分组**(每组内相邻项差值 ≤ `extension_window`),同时严格保留 `detected_time` 的原始顺序,避免回溯合并。
在实际业务场景中(如轨迹聚类、设备驻留时段分析、IoT 事件窗口聚合),我们常需将时间序列数据按“连续性”逻辑分组——但不是简单按数值取整分桶,而是要求:后一项若超出前一项允许的扩展范围(extension_window),则必须开启新组;且分组方向只能向前推进,不可回溯修正已分组项。这本质上是一种贪心式滑动窗口分组(Greedy Range Grouping)。
以下为完整、健壮的实现方案:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
✅ 核心逻辑说明
- 遍历数组,对每一项计算其与前一项 estimated_stay_time 的差值(delta)
- 若为首项(i === 0)、或 delta extension_window(超出容忍范围),则新建分组
- 否则,将当前项追加至上一组(r.at(-1).push(o))
✅ 可直接运行的代码示例
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 result = data.reduce((groups, item, index, arr) => {
// 计算与前一项的 estimated_stay_time 差值
const prevEstimate = arr[index - 1]?.estimated_stay_time ?? 0;
const delta = item.estimated_stay_time - prevEstimate;
// 触发新组的三种情况:首项 / 时间倒退 / 超出窗口
if (index === 0 || delta item.extension_window) {
groups.push([item]);
} else {
groups[groups.length - 1].push(item);
}
return groups;
}, []);
console.log(JSON.stringify(result, null, 2));
⚠️ 关键注意事项
- extension_window 是每个对象自身的属性,而非全局常量——本例中虽全为 100000,但代码支持动态窗口,增强可扩展性;
- delta
- 使用 ?. 链式访问和空值合并 ?? 0 保证健壮性,避免 undefined 运算报错;
- reduce 单次遍历,时间复杂度 O(n),空间复杂度 O(n),为最优解法。
? 扩展建议
如需支持自定义分组键(如按 detected_time 分段再按 estimated_stay_time 细分),可在外层增加预分片逻辑;若需反向兼容旧版 JS 环境,可将 at(-1) 替换为 groups[groups.length - 1]。
该方案兼顾语义清晰性、运行效率与工程鲁棒性,适用于实时数据流、前端聚合及 Node.js 后端批处理等多场景。










