高效合并数组和区间需按场景选工具:数组合并重结构一致,用扩展运算符或concat;区间合并重有序扫描,须先排序再线性合并,依赖排序与比较。

高效合并数组和区间,关键不在堆砌方法,而在匹配场景选对工具。数组合并重在“结构一致、目标明确”,而区间合并重在“有序判断、一次扫描”。两者逻辑不同,但都依赖排序与比较这两个底层动作。
数组合并:按数据类型和键策略选方法
合并普通一维数组时,优先用扩展运算符([...a, ...b]),简洁且语义清晰;若需兼容旧环境或处理大量数据,concat() 更稳妥。遇到对象数组或需去重,可组合 Set 或 filter()。
- 纯数值/字符串数组:直接展开
[...arr1, ...arr2, ...arr3] - 含重复项需去重:先扁平再去重
[...new Set(arr1.flat())] - 对象数组按 id 合并:用 Map 去重
const map = new Map(); arrs.flat().forEach(item => map.set(item.id, item));
区间合并:必须先排序,再线性扫描
区间不是普通数组,它是成对的 [start, end]。直接遍历无法判断重叠,必须先按 起始点升序排序,然后逐个比对前一个区间的右端是否 ≥ 当前区间的左端。满足即合并,否则推入结果。
- 排序不可省:用
intervals.sort((a, b) => a[0] - b[0]) - 合并逻辑只维护一个“当前区间”变量:
let [left, right] = intervals[0],后续不断更新right = Math.max(right, cur[1]) - 不重叠时才提交:
if (cur[0] > right) { result.push([left, right]); [left, right] = cur; }
多变量区间合并实战:从配置到坐标
实际中,“多个变量区间”常表现为分段配置、时间窗口、地理范围等。例如合并三组 API 返回的时间段:[[10,15], [14,20]]、[[8,12]]、[[25,30]]。先拼成一个大数组,再统一排序合并:
- 收集所有区间:
const allIntervals = [...api1, ...api2, ...api3]; - 去空与校验:
.filter(([s,e]) => s !== undefined && e !== undefined && s - 执行标准合并流程 —— 排序 → 扫描 → 输出
性能与边界注意点
合并操作看似简单,但容易在边界出错。比如 [1,4] 和 [4,5] 是否算重叠?题目通常定义为“可合并”(因端点相接)。代码中应写 cur[0] 而非 。另外,空数组、单区间、全重叠等边界情况需提前判断,避免索引越界或循环跳过。










