我有这个代码。我什至用 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);
您正在使用数组的相同对象引用填充数组
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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句