如何将数组中相邻相同元素分组?JS代码问题排查
相邻相同元素分组的JavaScript代码修复方案
要将数组[1,1,2,2,2,3,4,4,4]按相邻相同元素分组为[[1,1],[2,2,2],[3],[4,4,4]],你尝试的两段代码分别存在遗漏最后一组、最后一组元素缺失的问题,以下是具体原因和修复方法:
第一段代码问题分析与修复
问题代码
const arr=[1,1,2,2,2,3,4,4,4]; const result=[]; for(let i=0,j=1;j<arr.length;j++){ if(arr[j-1]!=arr[j]){ result.push(arr.slice(i,j)); i=j; } } document.write(JSON.stringify(result));
问题原因
循环仅在相邻元素不同时执行切片并推入结果,但最后一组元素后面没有不同元素触发这个逻辑,导致循环结束后最后一组被遗漏。
修复代码
const arr=[1,1,2,2,2,3,4,4,4]; const result=[]; let i=0; for(let j=1;j<arr.length;j++){ if(arr[j-1]!==arr[j]){ result.push(arr.slice(i,j)); i=j; } } // 循环结束后手动添加最后一组 result.push(arr.slice(i)); document.write(JSON.stringify(result));
修复说明
循环结束后,变量i指向最后一组元素的起始索引,调用arr.slice(i)会从该索引开始取到数组末尾,刚好把最后一组完整推入结果。
第二段代码问题分析与修复
问题代码
const arr=[1,1,2,2,2,3,4,4,4]; const result=[]; for(let i=0,j=1;j<arr.length;j++){ if(arr[j-1]!=arr[j] || j==arr.length-1){ result.push(arr.slice(i,j)); i=j; } } document.write(JSON.stringify(result));
问题原因
当j等于数组最后一个元素的索引时,arr.slice(i,j)的结束索引不包含j对应的元素,导致最后一组少了最后一个值。
修复代码
const arr=[1,1,2,2,2,3,4,4,4]; const result=[]; for(let i=0,j=1;j<=arr.length;j++){ if(j === arr.length || arr[j-1]!==arr[j]){ result.push(arr.slice(i,j)); i=j; } } document.write(JSON.stringify(result));
修复说明
将循环条件改为j<=arr.length,当j等于数组长度时触发切片逻辑,此时arr.slice(i,j)会从i取到数组末尾(因为slice的结束索引等于数组长度时,会取到最后一个元素),同时保留相邻元素不同时的切片逻辑,所有分组都能正确生成。
内容的提问来源于stack exchange,提问作者wcminipgasker2023
相关产品推荐
相关产品推荐

