分页算法工作不正确

时间:2010-02-19 14:33:38

标签: javascript algorithm pagination

我在这里有一个相当简单的分页算法,但它没有像我希望的那样工作。

目前它正在显示如下

1 2 3 ... 33 34 35 [36] 37 38 ... 47 48 49 50

什么时候应该这样显示

1 2 3 ... 33 34 35 [36] 37 38 39 ... 48 49 50

这是我的代码,我写得很快。它似乎也在不断运行(循环不会停止),但我不知道为什么。

$(function(){
            var pages = 50;                 //Total number of pages
            var current = 36;               //The current page we are on
            var before = 3;                 //Number of links to display before current
            var after = 3;                  //Same as above but after
            var start = (current - before); //The number of the first link
            var end = (current + after);    //Number of the end link

            for(var i = 1; i <= pages; i++){
                if(i == (before + 1)){
                    i = start;
                    document.write('...');
                }
                else if(i == (current + after)){
                    i = (pages - after);
                    document.write('...');
                }
                if(i == current){
                    document.write(' ['+i+'] ');
                }
                else{
                    document.write(' '+i+' ');
                }
            }
        });

5 个答案:

答案 0 :(得分:2)

请在您使用它的循环中的所有位置的2个位置将after修复为after + 1

另外,我不确定您的代码是否能正常处理边缘情况(例如当前== 2) - 您可能想要测试

答案 1 :(得分:2)

如果(current + after) > (pages - after)(current + after) < pages,则此代码将永久运行,因为:

else if(i == (current + after)){
    i = (pages - after);
    document.write('...');
}

每次i到达current + after时,它都会缩短为pages - after,并且该周期将无限期地继续

答案 2 :(得分:1)

  1. current + after在这里是39(36 + 3),所以难怪它显示“...”而不是39,将“之后”增加1来解决此问题
  2. 看了几分钟后的代码,我不知道为什么它应该永远运行:)你是否尝试过将“i”写入控制台来检查它需要的值以及为什么它永远不会达到“最终值”值“α

答案 3 :(得分:0)

在大多数语言中,数组使用基于零的索引是有原因的:数学更简单。在您的情况下,由于您显然不能使用从零开始的索引,您只需要修复一个一个错误:

else if(i == (current + after + 1)){
    i = (pages - after + 1);
    document.write('...');
}

答案 4 :(得分:0)

以下算法在当前页面周围提供5页

例:
- [X]是当前页面
- 在这种情况下,总页数为20

<[1] 2 3 4 5>   
<1 [2] 3 4 5>  
<1 2 [3] 4 5>        
<2 3 [4] 5 6>  
...  numbers in between ...  
<15 16 [17] 18 19>  
<16 17 [18] 19 20>  
<16 17 18 [19] 20>   
<16 17 18 19 [20]> 

或者如果总页数少于5,说3 ...
结果看起来像

<[1] 2 3>

等等。

function (page, totalPages) {
    var leftBoundry = Math.max(1, page - 2)
    var rightBoundry = Math.min(totalPages, page + 2)
    var arr = []
    var emptyRight = 2 - (rightBoundry - page)
    var emptyLeft = 2 - (page - leftBoundry)

    leftBoundry = Math.max(1, leftBoundry - emptyRight)
    rightBoundry = Math.min(totalPages, rightBoundry + emptyLeft)

    for (var i = leftBoundry; i <= rightBoundry; i++) {
        arr.push(i)
    }

    return arr;
}