[英]Assigning to array doesn't work as expected
我试图从例如顺时针旋转数组:
[[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 ] ]
有人可以帮我解释一下这是怎么回事吗?
问题是您创建输出数组的方式:
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);
问题是输出数组
解决方案:
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;
}
此函数可以单行写成三个映射:
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], ]))
请注意,这也适用于非正方形网格。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.