如何在JavaScript中将一维数组元素存入9x9数组?数独求解器遇问题
修复数独一维数组转9x9二维数组的问题
嘿,我帮你排查出代码里的几个关键问题,咱们一步步来解决:
问题分析
你的代码出现两个核心问题,导致最终输出还是全null的二维数组:
1. 拼写错误
内层循环里的problemArray.lenght是笔误,正确的拼写应该是problemArray.length。这个错误直接导致内层循环根本没有执行,所以sudoku数组完全没被赋值。
2. 循环逻辑错误
你用了双层循环来处理一维转二维,但逻辑完全不对:
problemArray是81个元素的一维数组,对应9x9二维数组的每一个格子,不需要双层循环。- 就算拼写修复,你的逻辑会把
sudoku[i][0]到sudoku[i][8]全部赋值为problemArray[i],这会让每一行的所有格子都是同一个值,而且当i>=9时,sudoku[i]不存在(因为sudoku只有9行),还会抛出数组越界错误。
3. 额外的小问题
- 循环变量
i和j没有用let/var声明,会变成全局变量,容易引发意外bug。 - 原字符串中的数字是字符类型,直接赋值的话后续数独计算会不方便,建议转为数字类型,
-保持为null。
修复后的代码
// 创建空的9x9数组 var sudoku = Array(9).fill(null).map(() => Array(9).fill(null)); // 字符串格式的数独示例 var problemString = "1-58-2----9--764-52--4--819-19--73-6762-83-9-----61-5---76---3-43--2-5-16--3-89--"; // 将问题字符串转为数组 var problemArray = problemString.split(''); // 遍历一维数组的每个元素,映射到二维数组对应位置 for (let i = 0; i < problemArray.length; i++) { // 计算当前元素对应的行索引:i除以9取整(0-8) const rowIndex = Math.floor(i / 9); // 计算当前元素对应的列索引:i除以9的余数(0-8) const colIndex = i % 9; // 转换值:'-'保留null,数字转为Number类型 sudoku[rowIndex][colIndex] = problemArray[i] === '-' ? null : Number(problemArray[i]); } console.log(sudoku);
代码解释
- 用单个循环遍历81个元素,通过
Math.floor(i/9)得到行号,i%9得到列号,完美对应9x9数组的每个位置。 - 修复了拼写错误,确保循环正常执行。
- 用
let声明循环变量,避免全局变量污染。 - 统一值的类型:数字转为
Number,占位符-转为null,方便后续数独求解的逻辑判断。
内容的提问来源于stack exchange,提问作者DeepGunner
相关产品推荐
相关产品推荐

