2017-03-03 71 views
5

你可以找到很多答案爲「旋轉的方形二維數組」,而不是「旋轉非正方形二維數組」,即使一些答案做這樣的工作之一:如何兩次旋轉非正方形二維陣列以獲得所有可能的旋轉?

rotate(tab) {                
     return tab[0].map(function(col, i) {         
      return tab.map(function(lig) {         
       return lig[i];            
      })                
     });                 
    } 

他們唯一的工作第一次旋轉。如果再次旋轉,則返回到第一個數組,這不是我想要的,我希望數組的所有3種可能的組合都旋轉90°。

回答

1

您可以使用數組長度來計算新位置。

original left right 
-------- -------- -------- 
1 2 3 4 1  3 6 
4 5 6 5 2  2 5 
      6 3  1 4 

function rotateRight(array) { 
 
    var result = []; 
 
    array.forEach(function (a, i, aa) { 
 
     a.forEach(function (b, j, bb) { 
 
      result[bb.length - j - 1] = result[bb.length - j - 1] || []; 
 
      result[bb.length - j - 1][i] = b; 
 
     }); 
 
    }); 
 
    return result; 
 
} 
 

 
function rotateLeft(array) { 
 
    var result = []; 
 
    array.forEach(function (a, i, aa) { 
 
     a.forEach(function (b, j, bb) { 
 
      result[j] = result[j] || []; 
 
      result[j][aa.length - i - 1] = b; 
 
     }); 
 
    }); 
 
    return result; 
 
} 
 

 
var array = [[1, 2, 3], [4, 5, 6]]; 
 

 
console.log(rotateLeft(array)); 
 
console.log(rotateRight(array));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

只是一個簡單的問題:你的代碼工作完美無缺......爲什麼不叫rotateLeft()兩次? –

+0

@OlivierPons,你可以做到這一點,對於你來說,你可以三次打電話給左邊,但我喜歡有兩個方向可供選擇。 –

0

你可以使用我已經寫了,爲了一個小庫,支持2D網格運算(https://github.com/klattiation/gridl)。它也支持旋轉。

const arr = [ 
    [1, 2, 3], 
    [4, 5, 6], 
]; 
const rotatedArray = gridl(arr).rotate(1).data(); 

// rotatedArray would look like this: 
// [ 
//  [4, 1], 
//  [5, 2], 
//  [6, 3], 
// ] 

你也可以旋轉在其他方向安靜輕鬆:

gridl(data).rotate(1); // rotates 90 degrees 
gridl(data).rotate(2); // rotates 180 degrees 
gridl(data).rotate(3); // rotates 270 degrees 
gridl(data).rotate(-1); // rotates -90 degrees 
gridl(data).rotate(-2); // rotates -180 degrees 
gridl(data).rotate(-3); // rotates -270 degrees