Javascript 多维矩阵上的逐元素数组运算

Javascript 多维矩阵上的逐元素数组运算,javascript,arrays,matrix,multidimensional-array,Javascript,Arrays,Matrix,Multidimensional Array,我正在用javascript创建一个2D矩阵,矩阵中的每个元素都是一个空数组 问题是,每当我尝试推送矩阵中的一个元素时,推送就会应用到整个矩阵,而不是特定的元素 代码如下: function createMatrix(numrows, numcols, initialValue = []) { var matrix = []; var row = []; while (numcols--) row[row.length] = initialValue; while (numro

我正在用javascript创建一个2D矩阵,矩阵中的每个元素都是一个空数组

问题是,每当我尝试推送矩阵中的一个元素时,推送就会应用到整个矩阵,而不是特定的元素

代码如下:

function createMatrix(numrows, numcols, initialValue = []) {
   var matrix = []; var row = [];
   while (numcols--) row[row.length] = initialValue;
   while (numrows--) matrix[matrix.length] = row.slice();
   return matrix;
};

function printMatrix(matrix) {
   var output = '';
   for (var i = 0; i < matrix.length; i++) {
       output += '[';
       for (var j = 0; j < matrix[i].length; j++) {
           output += '  ' + matrix[i][j];
       }
       output += '  ]\n';
   }
   console.log(output);
};

// Example code
var A = createMatrix(3,6, []);
printMatrix(A)

// This is the output:
// [              ]
// [              ]
// [              ]

// For example, we now try to add number 7 to the empty array at [1][2]
A[1][2].unshift(7);

// Let's see how the matrix looks like:
printMatrix(A)
// [  7  7  7  7  7  7  ]
// [  7  7  7  7  7  7  ]
// [  7  7  7  7  7  7  ]

非常感谢你的帮助。谢谢。

您可以对rows元素使用slice来获得独立的元素

while (numrows--) matrix[matrix.length] = row.map(a => a.slice());
//                                            ^^^^^^^^^^^^^^^^^^^
函数createMatrix(numrows,numcols,initialValue=[]){ var矩阵=[];var行=[]; 而(numcols--)行[row.length]=初始值; 而(numrows--)矩阵[matrix.length]=row.map(a=>a.slice()); 收益矩阵; }; 函数打印矩阵(矩阵){ var输出=“”; 对于(变量i=0;iprintMatrix(A)您可以对rows元素使用slice来获得独立的元素

while (numrows--) matrix[matrix.length] = row.map(a => a.slice());
//                                            ^^^^^^^^^^^^^^^^^^^
函数createMatrix(numrows,numcols,initialValue=[]){ var矩阵=[];var行=[]; 而(numcols--)行[row.length]=初始值; 而(numrows--)矩阵[matrix.length]=row.map(a=>a.slice()); 收益矩阵; }; 函数打印矩阵(矩阵){ var输出=“”; 对于(变量i=0;i第一个问题是,您试图将同一初始数组的引用
initialValue
分配给具有以下行的每一列:

while (numcols--) row[row.length] = initialValue;  // <----

第二个问题:如果数组包含嵌套数组,“克隆”将包含对旧数组的引用
这是在此行的矩阵行上发生的情况:

while (numrows--) matrix[matrix.length] = row.slice();  // <---

现在,您将获得所需的输出:

A[1][2].unshift(7);

[              ]
[      7        ]
[              ]
第一个问题是,您试图将同一初始数组的引用
initialValue
分配给具有以下行的每一列:

while (numcols--) row[row.length] = initialValue;  // <----

第二个问题:如果数组包含嵌套数组,“克隆”将包含对旧数组的引用
这是在此行的矩阵行上发生的情况:

while (numrows--) matrix[matrix.length] = row.slice();  // <---

现在,您将获得所需的输出:

A[1][2].unshift(7);

[              ]
[      7        ]
[              ]

谢谢大家的评论和回答。非常感谢

我还得出了相同的结论,即问题是由于“slice()”导致的浅拷贝造成的。下面是一个更简单的实现,它解决了问题,以防将来有人需要它:

function createMatrix(dimensions) {
    var matrix = [];

    for (var i = 0; i < dimensions[0]; ++i)
      matrix[matrix.length] = (dimensions.length == 1 ? [] : createMatrix(dimensions.slice(1)));

    return matrix;
};
函数createMatrix(维度){
var矩阵=[];
对于(变量i=0;i<尺寸[0];++i)
矩阵[matrix.length]=(dimensions.length==1?[]:创建矩阵(dimensions.slice(1));
收益矩阵;
};

感谢您的评论和回答。非常感谢

我还得出了相同的结论,即问题是由于“slice()”导致的浅拷贝造成的。下面是一个更简单的实现,它解决了问题,以防将来有人需要它:

function createMatrix(dimensions) {
    var matrix = [];

    for (var i = 0; i < dimensions[0]; ++i)
      matrix[matrix.length] = (dimensions.length == 1 ? [] : createMatrix(dimensions.slice(1)));

    return matrix;
};
函数createMatrix(维度){
var矩阵=[];
对于(变量i=0;i<尺寸[0];++i)
矩阵[matrix.length]=(dimensions.length==1?[]:创建矩阵(dimensions.slice(1));
收益矩阵;
};