如何将含分组标识的JS字符串数组转换为带嵌套数组的对象
实现代码
const numberGroupArray = [ 'GROUP_A', 'ONE', 'TWO', 'BREAK', 'FOUR', 'GROUP_B', 'SIX', 'GROUP_C', 'EIGHT', 'BREAK', 'TEN', 'ELEVEN', 'GROUP_D', 'THIRTEEN', 'BREAK', 'FIFTEEN', 'BREAK', 'SEVENTEEN', 'EIGHTEEN', 'NINETEEN', ]; const numberInGroup = {}; // 存储当前活跃分组名 let currentGroup = null; // 存储当前分组正在写入的子数组 let currentSubArray = null; numberGroupArray.forEach((item, index) => { // 处理分组标识 if (item.startsWith('GROUP_')) { currentGroup = item; // 初始化分组的外层数组,以及第一个子工作数组 numberInGroup[currentGroup] = []; currentSubArray = []; numberInGroup[currentGroup].push(currentSubArray); return; } // 处理拆分标识 if (item === 'BREAK') { if (currentGroup) { // 新建子工作数组,后续下标推入新数组 currentSubArray = []; numberInGroup[currentGroup].push(currentSubArray); } return; } // 普通元素写入当前子数组 if (currentGroup && currentSubArray) { currentSubArray.push(index); } });
执行后numberInGroup的结构和你要求的目标结构完全一致。
核心逻辑说明
- 遍历数组时同步获取每一项的下标,作为最终存入对象的数值
- 遇到
GROUP_开头的项时,切换当前分组,为新分组初始化外层数组和第一个子工作数组 - 遇到
BREAK时,为当前分组新增一个空的子工作数组,后续普通项的下标会推入这个新数组 - 既不是分组名也不是BREAK的普通项,直接把自身下标推入当前活跃的子工作数组
- 额外做了边界兼容:未匹配到分组的情况下遇到BREAK或普通项会直接忽略,避免报错
内容的提问来源于stack exchange,提问作者Aymur
相关产品推荐
相关产品推荐

