này sẽ làm điều đó:
var arr = [];
var rows = 4;
var cols = 10;
for(var i = 0; i < rows + cols - 1; i++){
for(var j = Math.min(rows, i + 1) - 1; j >= Math.max(0, i - cols + 1); j--){
arr.push((j * cols) + i - j);
}
}
fiddle: http://jsfiddle.net/BmXpy/
EDIT: Đây là nỗ lực của tôi trong việc giải thích làm thế nào tôi đến với điều này. QUAN TRỌNG, sử dụng bảng số ở trên để hình dung và nếu cần, hãy in nó và vẽ các đường chéo.
Đầu tiên, hãy nghĩ về những gì chúng tôi muốn, về cơ bản là đường chéo. Trong ví dụ trên đường chéo đầu tiên là 0, sau đó 10, 1, sau đó 20, 11, 2, sau đó 30, 21, 12, 3, v.v. Bây giờ nếu bạn nghĩ về số lượng các đường chéo đó, đó là rows + cols - 1
. Đó là nơi chúng tôi nhận được vòng lặp đầu tiên:
for(var i = 0; i < rows + cols - 1; i++){
Bây giờ, bỏ qua một giây. Trong trường hợp chung (toàn bộ trung tâm), mỗi đường chéo là "hàng" dài. Và kể từ khi chúng tôi muốn đi dưới lên, chúng tôi muốn có một vòng lặp ngược lại. Điều đó sẽ giống như thế này cho vòng lặp bên trong:
for(var j = rows - 1; j >= 0; j--){
Bây giờ, chúng ta phải đối phó với cả hai ranh giới (trái và phải).
Đối với khung giới hạn bên trái, nếu chúng ta nhìn vào số lượng đường chéo nhỏ hơn "hàng", chúng ta sẽ thấy rằng nó là rows - 1
. Và đối với những đường chéo này, chúng ta sẽ thấy rằng chiều dài của mỗi đường là i + 1
. Vòng lặp bên trong sau sẽ xử lý các trường hợp nói chung và ranh giới trái:
for(var j = Math.min(rows, i + 1) - 1; j >= 0; j--){
Bạn sẽ thấy rằng đối với đường chéo 0, điều này sẽ chạy một lần, trong vòng 1 nó sẽ chạy hai lần, vv Và đối với trường hợp chung (i >= rows
) nó sẽ chạy "hàng" lần.
Bây giờ, giới hạn bên phải. Nếu chúng ta nhìn vào đường chéo nào bên phải ngắn hơn "hàng", chúng ta sẽ thấy nó là tất cả đường chéo lớn hơn "cols" (trong ví dụ nơi cols là 10, 0 được lập chỉ mục, đó là hàng 10 và cao hơn).Thay thế j >= 0
bằng j >= Math.max(0, i - cols + 1)
sẽ chạy tới 0 cho trường hợp chung và khung giới hạn bên trái nhưng rút ngắn cho giới hạn bên phải. Chúng tôi nhận được điều này:
for(var j = Math.min(rows, i + 1) - 1; j >= Math.max(0, i - cols + 1); j--){
Và cuối cùng, tính toán thực tế của số ở mỗi vị trí. i
đại diện cho đường chéo và j
đại diện cho chỉ số của số trên đường chéo j = 0
là số đầu nếu bạn đang xem bảng số đã đăng. Đối với j = 0
(hàng trên cùng của số), số đơn giản là i
, đối với mỗi hàng bên dưới đầu, chúng tôi cần nhân số bằng "cols" để lấy số trực tiếp bên dưới số hàng đầu tiên, sau đó số cần phải điều chỉnh sang trái. Điều này được thực hiện bằng cách trừ j
là số hàng. Vì vậy, đối với j = 1
(hàng thứ 2), chúng ta cần phải di chuyển số sang trái một (trừ 1). Vì vậy, chúng tôi có i
cho vị trí nằm ngang trên hàng đầu tiên, + (j * cols)
để di chuyển nó xuống hàng thích hợp và sau đó -j để điều chỉnh nó thành đường chéo (nếu bạn vẽ đường chéo, hãy theo dõi điều này cho một trong số chúng trực quan). Chúng tôi nhận được điều này:
(j * cols) + i - j
Đặt tất cả lại với nhau và bạn nhận được mã cuối cùng ở trên. Hy vọng rằng thực hiện một số ý nghĩa.
Nó sẽ luôn luôn cho hoạt hình đường chéo từ trái qua phải không? – Diego
không, tôi cũng muốn làm điều này r-t-l chéo, hoặc xoay từ trung tâm vv Nhưng bây giờ tôi muốn hiểu làm thế nào tôi có thể làm điều này cho trường hợp này, l-t-r chéo – Alexandra