Javascript 多维矩阵上的逐元素数组运算
我正在用javascript创建一个2D矩阵,矩阵中的每个元素都是一个空数组 问题是,每当我尝试推送矩阵中的一个元素时,推送就会应用到整个矩阵,而不是特定的元素 代码如下: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
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;iwhile (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;iinitialValue
分配给具有以下行的每一列:
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));
收益矩阵;
};