JavaScript中对象的随机矩阵生成问题

JavaScript中对象的随机矩阵生成问题,javascript,arrays,sudoku,Javascript,Arrays,Sudoku,我正试图用JavaScript在4×4的网格上制作一个数独生成器。 因此,我声明了一个对象矩阵,如{number:0,cbd:1},它表示单元上的数字,以及一个状态变量,该状态变量控制该单元以后是否可以被挖掘(cbd): 然后,我使用此函数填充网格,遵守所有3个数独限制:行、列和正方形上没有重复: fillmatrix4(matrix,tam){ var numberList = [...Array(4+1).keys()].slice(1); //[1,2,3,4] for(var k = 0

我正试图用JavaScript在4×4的网格上制作一个数独生成器。 因此,我声明了一个对象矩阵,如{number:0,cbd:1},它表示单元上的数字,以及一个状态变量,该状态变量控制该单元以后是否可以被挖掘(cbd):

然后,我使用此函数填充网格,遵守所有3个数独限制:行、列和正方形上没有重复:

fillmatrix4(matrix,tam){
var numberList = [...Array(4+1).keys()].slice(1); //[1,2,3,4]
for(var k = 0; k < 4**2; k++){
    var row = Math.floor(k/4);
    var col = k%4;
    if (matrix[row][col].number == 0){
        numberList.sort(() => Math.random() - 0.5); //shuffles the array
        for(var q = 0; q < numberList.length; q++){
            var ids = matrix[row].map(a => a.number); //creates an array with the number property from all cells in that row
            if (!(ids.includes(numberList[q]))){ //check if number is in row
                if ((matrix[0][col].number != numberList[q]) && (matrix[1][col].number != numberList[q]) && (matrix[2][col].number != numberList[q]) && (matrix[3][col].number != numberList[q])){ //check if number is in column 
                    var square = [];
                    if (row<2){It is used to find out what subgrid we are in
                        if (col<2){
                            square = [matrix[0][0].number, matrix[0][1].number, matrix[1][0].number, matrix[1][1].number];
                        } else {  
                            square = [matrix[0][2].number, matrix[0][3].number, matrix[1][2].number, matrix[1][3].number];
                        }
                    } else {
                        if (col<2){
                            square = [matrix[2][0].number, matrix[2][1].number, matrix[3][0].number, matrix[3][1].number];
                        } else {  
                            square = [matrix[2][2].number, matrix[2][3].number, matrix[3][2].number, matrix[3][3].number];
                        }
                    }
                    if (!(square.includes(numberList[q]))){ //check if number is that subgrid
                        matrix[row][col].number = numberList[q]; //if number not in row, column and square, adds it to matrix
                        if (this.checkGrid(matrix,tam)){ //returns true all matrix is filled
                            return matrix;
                        } 
                    }
                }
            }
        }
    }
}
原因可能是什么?

当您这样做时:

Array(4).fill({number: 0, cbd: 1})
这将使用对内存中相同对象的引用填充每个条目。从图形上看,它看起来像:

——。
|编号:0|
|生物多样性公约:1|
`-----------`
^  ^  ^  ^
|  |  |  |
变量“矩阵”:[0,1,2,3]
对这些数组索引中的任何一个所做的更改都将改变相同的基础对象

以下是一个最小、完整、可复制的示例:

const arr=Array(4).fill({foo:bar});
arr[0].foo=“baz”;
log(JSON.stringify(arr,null,2));
控制台日志(arr)当您执行以下操作时:

Array(4).fill({number: 0, cbd: 1})
这将使用对内存中相同对象的引用填充每个条目。从图形上看,它看起来像:

——。
|编号:0|
|生物多样性公约:1|
`-----------`
^  ^  ^  ^
|  |  |  |
变量“矩阵”:[0,1,2,3]
对这些数组索引中的任何一个所做的更改都将改变相同的基础对象

以下是一个最小、完整、可复制的示例:

const arr=Array(4).fill({foo:bar});
arr[0].foo=“baz”;
log(JSON.stringify(arr,null,2));

控制台日志(arr).sort()
进行代码>洗牌是行不通的。另外,当您将一个对象传递给
.fill()
时,您将使用对同一个对象的引用填充数组。像这样使用
.sort()
洗牌不会真正起作用。另外,当您将一个对象传递给
.fill()
时,您会用对同一个对象的引用填充数组。@ggorlen定义很好。我有一个努巴问题。你是如何制作图形定义的?:)你是说ASCII框?我刚刚在文本框中输入了它,但是像这样的工具也可以使用。@ggorlen定义不错。我有一个努巴问题。你是如何制作图形定义的?:)你是说ASCII框?我只是在文本框中输入了它,但是有些工具你可以使用。
Array(4).fill({number: 0, cbd: 1})