如何在JavaScript嵌套循环中中断迭代生成二维数组
问题点说明
你当前的代码存在两个核心问题,无法实现生成二维数组的需求:
- 手动写的break判断永远不会触发:内层for循环的终止条件是
j < attrcol1[i].length,循环执行过程中j的最大值为attrcol1[i].length - 1,你写的判断条件j == attrcol1[i].length永远无法满足,属于无效代码。 - 所有处理后的值都被推入同一个一维数组
pushed,没有做二维数组的分层存储,最终得到的是扁平的一维数组,不符合预期。 - 额外说明:内层for循环本身在遍历完当前外层项的所有元素后会自动终止迭代,不需要额外添加break语句手动中断。
可直接运行的修正代码
逻辑为:外层循环每遍历一个子项时,先初始化一个临时子数组存储当前行的元素;内层循环遍历当前外层项的所有成员,处理后推入临时子数组;内层循环自然结束后,将整个临时子数组推入最终结果数组,即可得到目标二维数组。
const twoDimResult = []; for (let i = 0; i < attrcol1.length; i++) { // 初始化当前行的子数组 const currentRow = []; for (let j = 0; j < attrcol1[i].length; j++) { const a = attrcol1[i][j]; const ob = Object.values(a)[0]; currentRow.push(ob); // 如果有自定义提前中断内层循环的需求,在这里加判断后执行break即可,例如 // if (/* 自定义中断条件 */) break; } // 当前行处理完成后推入二维结果数组 twoDimResult.push(currentRow); }
简洁写法参考
如果不需要在内层循环做额外的中断判断,可以直接用数组原生map方法实现,不需要手动管理循环索引:
const twoDimResult = attrcol1.map(rowItem => rowItem.map(cellItem => Object.values(cellItem)[0]) );
内容的提问来源于stack exchange,提问作者STU STU
相关产品推荐
相关产品推荐

