正/负模数,用于获取范围内的项目



我用负数查看了 https://math.stackexchange.com/questions/519845/modulo-of-a-negative-number 和模运算,但我仍然想知道如何使用负模值来获取范围内的项目。

这是我的问题下面的一个简化用例,我有一个包含 3 张幻灯片的幻灯片(slidesCount = 3(:

slide indexes:    0     1     2

现在我想从这些数字中访问正确的幻灯片:

-2   -1       0   1   2       3   4
should match slide:
1    2       0   1   2       0   1

因此,通过index % slidesCount,我将介绍这些情况:

0   1   2       3   4 

但不是负值。-1 % 3返回-1那么如果索引为负数slidesCount + index % slidesCount表达式是否正确?

首先,有没有更简单/更聪明的写作方式:

index = index % slidesCount + (index < 0 ? slidesCount : 0)

现在我的问题是每张幻灯片 3 个可见项目的幻灯片, 其中最后一张幻灯片可能只有一个项目(索引 9 波纹管(,因此从这些数字来看:

-3 -2 -1         0 1 2   3 4 5   6 7 8   9       10 11 12

我想匹配幻灯片:

9              0       3       6     9           0

我希望下图有意义!请帮助我以最小的if秒从中得到正确的方程:

-3 -2 -1               0 1 2   3 4 5   6 7 8   9             10 11 12
|________|             |______________________________________________|
||                              ||                           ||
||                              Math.floor( i / visibleSlides )
Math.ceil(i / visibleSlides)            ||                           ||
||                              ||                           ||
/                              /                           /
-1                    0       1       2     3                 4
|___|                 |_______________________|              |___|
||                              ||                           ||
slidesCnt + i % visibleSlides       i % visibleSlides                || ??
||                              ||                           ||
/                              /                           /
3                    0       1       2     3                 0
|| i * visibleSlides
/ 
9                    0       3       6     9                 0

最后,这就是我解决问题的方式:

// Prevents out of range.
// e.g. -1, -2, 12, 13
let newIndex = (index + slidesCount) % slidesCount
// Calculates how many items are missing on last slide. 
// e.g. if 10 slides with 3 visible slides, 2 missing slides on last slide.
let lastSlideItems = slidesCount % visibleSlides || visibleSlides
let missingItems = visibleSlides - lastSlideItems
// If index is negative adjust by adding the missing slides.
newIndex += index < 0 ? missingItems : 0
// Always get the first item of the series of visible items.
// e.g. if index is 8 and 3 visible slides, newIndex will be 6. 
newIndex = Math.floor(newIndex / visibleSlides) * visibleSlides

最新更新