我有这个代码。我甚至把console.logs调试了。但我真的不明白他们为什么会以不同的方式行事。为什么result1数组用最后一个数组值填充所有内部数组?
var myMatrix = [
[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11],
[12, 13, 14, 15]
];
function rotateMatrixClockwise(matrix) {
var long = matrix.length;
var result1 = new Array(long).fill([]);
var result2 = [ [], [], [], [] ];
console.log("Empty result1:");
console.log(result1);
console.log("Empty result2:");
console.log(result2);
for (var row = 0; row < long; row++) {
for (var col = 0; col < long; col++) {
result1[row][col] = matrix[long - col - 1][row];
result2[row][col] = matrix[long - col - 1][row];
}
}
console.log("Result1:");
console.log(result1);
console.log("Result2:");
console.log(result2);
}
rotateMatrixClockwise(myMatrix);
&#13;
答案 0 :(得分:2)
您正在使用
中相同的数组对象引用填充数组var result1 = new Array(long).fill([]);
// ^^ same array for all elements
以后的任何作业都会在同一个数组中进行。
在工作版中,
var result2 = [[], [], [], []];
// ^^ ^^ ^^ ^^ four different arrays
你需要四个不同的数组,它们没有引用同一个数组。
Array.fill
的引用说明了静态行为,而Javascript则通过引用移交了对象。
fill()
方法使用静态值将数组的所有元素从起始索引填充到结束索引。
var myMatrix = [
[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11],
[12, 13, 14, 15]
];
function rotateMatrixClockwise(matrix) {
var array = [];
var long = matrix.length;
var result1 = new Array(long).fill(array);
var result2 = [[], [], [], []];
console.log("Empty result1:");
console.log(result1);
console.log("Empty result2:");
console.log(result2);
for (var row = 0; row < long; row++) {
for (var col = 0; col < long; col++) {
result1[row][col] = matrix[long - col - 1][row];
result2[row][col] = matrix[long - col - 1][row];
}
}
console.log("Result1:");
console.log(result1);
console.log("Result2:");
console.log(result2);
console.log('array', array);
}
rotateMatrixClockwise(myMatrix)