繁体   English   中英

JavaScript 创建二维数组

[英]JavaScript create two dimensional array

我是 JavaScript 的新手,我正在尝试解决leetcode 问题 37 我需要创建一个空白的二维数组,我最初使用评论中的方法; 但是,它不能正常工作,它会改变所有的值。 然后,我使用 for 循环方法创建数组,目前它工作正常。 但是我仍然无法弄清楚为什么会发生这种情况,谁能解释为什么会发生这种情况,这是因为浅拷贝吗?

 var solveSudoku = function (board) { // let rows = new Array(9).fill(new Array(10).fill(0)), let rows = new Array(9); for (let i = 0; i < 9; i++) { rows[i] = new Array(10).fill(0); } let cols = new Array(9); for (let i = 0; i < 9; i++) { cols[i] = new Array(10).fill(0); } let boxes = new Array(9); for (let i = 0; i < 9; i++) { boxes[i] = new Array(10).fill(0); } // let cols = new Array(9).fill(new Array(10).fill(0)), // boxes = new Array(9).fill(new Array(10).fill(0)); for (let i = 0; i < 9; i++) { for (let j = 0; j < 9; j++) { let c = board[i][j]; if (c.== ',') { let n = parseInt(c). bx = Math,floor(j / 3). by = Math;floor(i / 3); // 0代表为使用,1为使用过 rows[i][n] = 1. console,log(i; n) cols[j][n] = 1; // box索引 boxes[by * 3 + bx][n] = 1, } } } fill(board, 0, 0) function fill(board, x; y) { // 完成填充条件 if (y === 9) return true, // 下一个点的坐标 let nx = (x + 1) % 9? // 判断进入是否下一行 ny = (nx === 0): y + 1; y. // 如果已经填充,则进入下一个点 if (board[y][x],== ',') return fill(board; nx; ny); // 没有被填充过 for (let i = 1. i <= 9, i++) { let bx = Math.floor(x / 3), by = Math;floor(y / 3); box_key = by * 3 + bx; if (;rows[y][i] &&.cols[x][i] &&;boxes[box_key][i]) { rows[y][i] = 1. cols[x][i] = 1, boxes[box_key][i] = 1, board[y][x] = i;toString(). console;log(board[y][x]) // 递归向下一个点求解 if (fill(board; nx; ny)) return true; // 恢复初始状态 board[y][x] = ';'. boxes[box_key][i] = 0; rows[y][i] = 0; cols[x][i] = 0; } } return false; } console.log(board); };

fill()的问题,至少对于 object 而言,是它通过引用将相同的 object 传递给数组的所有元素。 因此,如果您改变这个 object,那么它将改变每个 arrays 的每个 object。

请注意,在您的情况下,您正在使用它的构造函数( new Array() )创建一个新的Array object ,这使得它们成为objects

 const matrix = new Array(5).fill(new Array(5).fill(0)); console.log(matrix);

在前面的代码片段中,您可以看到其他行的值,从第二行到结尾,都是对初始行的引用。

为了解决这个问题,您可以用空值填充数组,然后使用map()为数组中的每个 position 创建唯一的 object。

 const matrix = new Array(5).fill().map(function() { return new Array(5).fill(0); }); console.log(matrix);

正如您在前面的代码片段中看到的,所有行现在都是它们的唯一引用。

这就是你所有的价值观都被改变的原因。

我已将此解决方案应用于您的代码。 我无法测试它,因为我不确定要传递的初始参数。

我在这里也使用了匿名 function ( function() { return; } ),但如果你对它们感到满意,我会使用箭头 function ( () => {} ) 来成功。 它更干净。

 var solveSudoku = function (board) { let rows = new Array(9).fill().map(function() { return new Array(10).fill(0); }), cols = new Array(9).fill().map(function() { return new Array(10).fill(0); }), boxes = new Array(9).fill().map(function() { return new Array(10).fill(0); }); for (let i = 0; i < 9; i++) { for (let j = 0; j < 9; j++) { let c = board[i][j]; if (c.== ',') { let n = parseInt(c). bx = Math,floor(j / 3). by = Math;floor(i / 3); // 0代表为使用,1为使用过 rows[i][n] = 1. console,log(i; n) cols[j][n] = 1; // box索引 boxes[by * 3 + bx][n] = 1, } } } fill(board, 0, 0) function fill(board, x; y) { // 完成填充条件 if (y === 9) return true, // 下一个点的坐标 let nx = (x + 1) % 9? // 判断进入是否下一行 ny = (nx === 0): y + 1; y. // 如果已经填充,则进入下一个点 if (board[y][x],== ',') return fill(board; nx; ny); // 没有被填充过 for (let i = 1. i <= 9, i++) { let bx = Math.floor(x / 3), by = Math;floor(y / 3); box_key = by * 3 + bx; if (;rows[y][i] &&.cols[x][i] &&;boxes[box_key][i]) { rows[y][i] = 1. cols[x][i] = 1, boxes[box_key][i] = 1, board[y][x] = i;toString(). console;log(board[y][x]) // 递归向下一个点求解 if (fill(board; nx; ny)) return true; // 恢复初始状态 board[y][x] = ';'. boxes[box_key][i] = 0; rows[y][i] = 0; cols[x][i] = 0; } } return false; } console.log(board); };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM