例如,我尝试顺时针旋转数组 来自:
[[1,2,3],
[4,5,6],
[7,8,9]]
制造商:
[[7,4,1],
[8,5,2],
[9,6,3]]
所以我为此编写了一个函数,如下所示:
function rotateImage(a) {
const arr = Array(a.length).fill(Array(a.length).fill(0));
for(let i =0; i< a.length; i++) {
for(let j = 0; j < a[i].length;j++ ){
console.log(i,j);
arr[j][a[i].length-1 - i] = a[i][j];
console.log(arr)
}
}
return arr;
}
这是我得到的日志:
0 0
[ [ 0, 0, 1 ], [ 0, 0, 1 ], [ 0, 0, 1 ] ]
0 1
[ [ 0, 0, 2 ], [ 0, 0, 2 ], [ 0, 0, 2 ] ]
0 2
[ [ 0, 0, 3 ], [ 0, 0, 3 ], [ 0, 0, 3 ] ]
1 0
[ [ 0, 4, 3 ], [ 0, 4, 3 ], [ 0, 4, 3 ] ]
1 1
[ [ 0, 5, 3 ], [ 0, 5, 3 ], [ 0, 5, 3 ] ]
1 2
[ [ 0, 6, 3 ], [ 0, 6, 3 ], [ 0, 6, 3 ] ]
2 0
[ [ 7, 6, 3 ], [ 7, 6, 3 ], [ 7, 6, 3 ] ]
2 1
[ [ 8, 6, 3 ], [ 8, 6, 3 ], [ 8, 6, 3 ] ]
2 2
[ [ 9, 6, 3 ], [ 9, 6, 3 ], [ 9, 6, 3 ] ]
所以当我有i=0
和j=0
时,我的代码应该变成这样:
arr[0][2]= a[0][0];
// so I should get
[ [ 0, 0, 1 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ]
// insted of
[ [ 0, 0, 1 ], [ 0, 0, 1 ], [ 0, 0, 1 ] ]
有人可以帮我解释一下这是怎么回事吗?
答案 0 :(得分:2)
问题在于您创建输出数组的方式:
const arr = Array(a.length).fill(Array(a.length).fill(0));
这表示“ arr
的每个元素都应等于Array(a.length).fill(0)
的结果。也就是说,数组arr
具有三个元素,每个元素都是同一对象。
因此,当您将值分配给arr[0][2]
时,您还将其分配给arr[1][2]
等。
您可以使用如下循环创建新矩阵:
var arr = Array(a[0].length);
for (var i = 0; i < arr.length; i++)
arr[i] = Array(a.length).fill(0);
答案 1 :(得分:2)
问题是输出数组
解决方案:
function rotateImage(a) {
let arr = Array(a.length);
for(let i =0; i< 3; i++) {
for(let j = 0; j < a[i].length;j++ ){
if(!arr[j]) {
arr[j] = Array(a[j].length)
}
arr[j][a[i].length-1 - i] = a[i][j];
}
}
return arr;
}
答案 2 :(得分:1)
此函数可以单行写成三个地图:
const rotateImage = a => a[0].map((_, i) => a.map(r => r[i])).map(r => r.reverse())
console.log(rotateImage([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]))
请注意,这也适用于非正方形网格。