
本文介绍一种不依赖正则表达式、高效且易理解的方法,将一维数字数组中所有连续的零序列提取为独立子数组,最终构成一个二维数组(如 [1,0,0,0,0,2,...] → [[0,0,0,0], [0,0,0,0,0,0,0]])。
本文介绍一种不依赖正则表达式、高效且易理解的方法,将一维数字数组中所有连续的零序列提取为独立子数组,最终构成一个二维数组(如 `[1,0,0,0,0,2,...]` → `[[0,0,0,0], [0,0,0,0,0,0,0]]`)。
在实际开发中,我们常需对数组进行逻辑分组——例如识别并提取连续的相同值(尤其是 0)构成子数组。上述问题的核心并非“创建任意二维数组”,而是按连续零段进行切分与结构化封装。正则方案虽简洁,但存在类型转换开销(数字→字符串→分割→再转回),且可读性与调试性较差。更优解是采用一次遍历的原生逻辑处理。
以下是推荐实现(已优化原始代码的可读性、健壮性与 JavaScript 最佳实践):
function groupConsecutiveZeros(arr) {
const result = [];
let currentGroup = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] === 0) {
currentGroup.push(0);
} else {
// 遇到非零数:若 currentGroup 不为空,则保存并重置
if (currentGroup.length > 0) {
result.push(currentGroup);
currentGroup = [];
}
}
}
// 处理末尾可能存在的连续零(循环结束后未被推入 result)
if (currentGroup.length > 0) {
result.push(currentGroup);
}
return result;
}
// 测试
const input = [1, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 5, 6];
console.log(groupConsecutiveZeros(input));
// 输出: [[0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]✅ 关键设计说明:
- 使用
===严格比较,避免0 == false等隐式转换陷阱; -
currentGroup动态累积连续零,遇非零即截断并归档,逻辑清晰无状态泄漏; - 显式处理数组末尾连续零场景(原始代码遗漏此边界情况,会导致最后一组零丢失);
- 无副作用、纯函数风格,便于单元测试与复用。
⚠️ 注意事项:
- 若输入含
null、undefined或NaN,需额外判断(arr[i] === 0已天然排除它们); - 此方法时间复杂度为 O(n),空间复杂度为 O(n),是最优解;
- 如需支持其他值(如连续
1或-1),只需将0替换为参数target即可泛化。
该方案兼顾性能、可维护性与教学价值,是处理此类“连续值分组”问题的标准范式。

















