2015-05-29 62 views
0

我試圖記住Javascript中的一種叫做「發條算術」的東西,我很久以前在關於幻燈片/旋轉木馬的教程中看過。 (因爲我無法找到谷歌什麼有用的術語可能是錯誤的)Javascript「發條算術」

這是下面的代碼的簡寫:

a = a + 1; 
if (a > total) a = 0; 

本質上,它是不斷遞增直到總量達到,而當它達到它將重置爲0.這主要用於創建無限期滾動的傳送帶,因爲它總是回滾到開始處(索引0)。

有沒有人如何使用上述發條算術在1行中寫上述2行代碼?我認爲它使用「餘數」運算符%,但我不記得其他很多。

+7

那麼..有什麼問題嗎? –

+0

@chRyNaN儘管實現了同樣的事情,但並不是我所尋找的。 – Beebee

回答

5

這被稱爲modular arithmetic,並有效地在鐘錶中使用:

一個熟悉的使用模運算的是在12小時時鐘,其中 一天被分爲兩個12小時時間段。如果時間現在是7:00,則 然後8小時後將是3:00。通常除了會建議 後來的時間應該是7 + 8 = 15,但由於時鐘時間「環繞」,每12小時

在JavaScript中,你可以使用% operatormodulo operations這不是答案 :

%運算符從隱含的 除法中得出其操作數的其餘部分;左邊的操作數是紅利,右邊的操作數是 除數。

一些相同的例子:

a = (a+1) % total; 
a = ++a % total; 
++a, a %= total; 
+2

您可以解釋'%'運算符代表模運算符,OP將要重現的內容稱爲[Modular Arithmetic](模塊算術)(http://en.wikipedia.org/wiki/Modular_arithmetic)。 – Prusse

1

我還沒有機會尚未驗證這一點,但我認爲這會是這個樣子:

a = a < total ? a++ : 0; 
1

你可以用三元來做到這一點,但我認爲這會使代碼不必要地難以閱讀,因此l可維護,所以我不會使用它。

a = a < total ? a + 1 : 0; 
1

根據要循環什麼左右,所不同的襯板可以

current = min + (delta = (delta + step) % (max - min)); 

下面是使用一個例子

function count(max, min, step) { 
    if (typeof min !== 'number') min = 0; 
    if (typeof step!== 'number') step = 1; 
    var delta = -step; 
    max = max - min; 

    return function next() { 
     return min + (delta = (delta + step) % max); 
    }; 
} 

var fn = count(4, 1, 1); 
fn(); // 1 
fn(); // 2 
fn(); // 3 
fn(); // 1 
fn(); // 2 
fn(); // 3 

同樣你可以得到任何迭代,如果你知道有多少步驟(i)它是通過使用

current = min + ((step * i) % (max - min));