分配给数组无法正常工作

时间:2018-11-02 14:50:33

标签: javascript arrays

例如,我尝试顺时针旋转数组 来自:

[[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=0j=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 ] ]

有人可以帮我解释一下这是怎么回事吗?

3 个答案:

答案 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],
]))

请注意,这也适用于非正方形网格。