
本文介绍如何将已排序数组中连续重复的字符串元素拼接成单个数字,适用于如 ['1','1','2','2','2'] → [11, 222] 的场景,提供可复用函数、边界处理说明及注意事项。
本文介绍如何将已排序数组中连续重复的字符串元素拼接成单个数字,适用于如 ['1','1','2','2','2'] → [11, 222] 的场景,提供可复用函数、边界处理说明及注意事项。
在 JavaScript 中,若需将已按值分组且相邻排列的字符串数组(如 ['1', '1', '2', '2', '2'])合并为对应数字组成的数组(如 [11, 222]),核心思路是:遍历数组,累积相同连续元素,遇值变化或到达末尾时将累积字符串转为数字并存入结果。
以下是一个健壮、可复用的实现:
function groupAndConcatenate(arr) {
if (!Array.isArray(arr) || arr.length === 0) return [];
const result = [];
let currentGroup = '';
for (let i = 0; i < arr.length; i++) {
currentGroup += arr[i];
// 当前元素与下一个不同,或已是最后一个元素 → 触发归组
if (i === arr.length - 1 || arr[i] !== arr[i + 1]) {
// 使用 Number() 更安全(相比 parseInt,避免隐式进制转换风险)
result.push(Number(currentGroup));
currentGroup = '';
}
}
return result;
}✅ 使用示例:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
const arr1 = ['1', '1', '2', '2', '2'];
const arr2 = ['10', '10', '10', '10', '34', '34', '34', '34', '34', '34', '92', '92'];
console.log(groupAndConcatenate(arr1)); // [11, 222]
console.log(groupAndConcatenate(arr2)); // [10101010, 343434343434, 9292]
// 格式化输出为题目要求的字符串形式:
const res1 = groupAndConcatenate(arr1);
const res2 = groupAndConcatenate(arr2);
console.log(`[${res1.join(', ')}] [${res2.join(', ')}]`);
// 输出:[11, 222] [10101010, 343434343434, 9292]⚠️ 重要注意事项:
立即学习“Java免费学习笔记(深入)”;
- ✅ 前提条件:数组必须已排序且相同元素连续。该算法不进行分组排序,仅合并相邻相同项。若输入为 ['2','1','1','2'],结果将是 [2, 11, 2],而非 [11, 22]。
- ✅ 使用 Number() 而非 parseInt(),避免 parseInt('08') 等意外八进制解析问题;所有输入应为有效数字字符串。
- ✅ 空数组或非数组输入已做防御性校验,返回空数组,提升鲁棒性。
- ❌ 不适用场景:需跨位置聚合(如去重后合并所有 '1')、或需保留原始顺序但元素不连续的情况——此时应先用 reduce + Map 或 Object.groupBy(ES2024)预分组。
该方法时间复杂度为 O(n),空间复杂度为 O(n),简洁高效,适合前端数据预处理、日志聚合、编码压缩等实际业务场景。

















