广告偏移后计算幻灯片索引

Calculating slide index after ad offset

我已经装配了一个简单的 JS 画廊来实现 "deep linking" 允许带有像 #slide-3 这样的散列的 URL 在第三张幻灯片处于活动状态时自动加载画廊。图库中每隔七张幻灯片就有一个广告。这些广告幻灯片未被跟踪,因此哈希变为 #slide-x 后跟图片幻灯片,即 #slide-7.]

我创建了一个辅助函数来将幻灯片编号从散列转换为 0 索引的幻灯片编号,考虑到每七张幻灯片的这些广告,但我很好奇是否有人能想出一种更优雅的方式来计算正确的索引,因为我的实现在我看来太复杂了:

var slideNum = parseInt( window.location.hash.replace( '#slide-', '' ), 10 );
slideNum += Math.floor( ( slideNum + Math.floor( slideNum / 7 ) ) / 7 ) - 1;
return slideNum;

这行得通,但有两层楼似乎有点过头了。必须有更简单的方法!然而,我不确定控制场内操作的代数规则,所以我不知道如何 expand/simplify 自己。任何帮助将不胜感激。

我包含了一个基本的 JS fiddle,它输出前 36 张幻灯片的值与其正确值的比较。随时用您的解决方案更改 testFunc,看看是否有效!

var nums = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36];

var correct = [0,1,2,3,4,5,7,8,9,10,11,12,14,15,16,17,18,19,21,22,23,24,25,26,28,29,30,31,32,33,35,36,37,38,39,40];

var testFunc = function( n ) {
    var offset = ( n + Math.floor( n / 7 ) ) / 7;
    return n + Math.floor( offset ) - 1;  
};

document.getElementById('text').innerHTML += 'Input Expected Output<br/>';
for( var i = 0; i < nums.length; i++ ) {
    document.getElementById('text').innerHTML += nums[i] + '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' + correct[i] + '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' + testFunc( nums[i] ) + '<br/>';
    if ( ( i + 1 ) % 6 === 0 ) {
         document.getElementById('text').innerHTML += 'AD<br/>';
    }
}
<div id="text"></div>

意识到我们在每个幻灯片元素上都有两个索引,所以我可以简单地 select 使用 URL 索引并从 DOM 获取真正的幻灯片索引。也许还是一个值得思考的有趣问题!?

是的,一个整数除法就够了:

var testFunc = function( n ) {
    n = n - 1;
    return Math.floor(n / 6) + n
};