簡體   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