Алгоритм разбивки на страницы работает некорректно - PullRequest
2 голосов
/ 19 февраля 2010

У меня здесь довольно простой алгоритм разбиения на страницы, но он работает не так, как мне бы хотелось.

В настоящее время он отображается так

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 ]

2 голосов
/ 19 февраля 2010

Если (current + after) > (pages - after) и (current + after) < pages, то этот код будет работать вечно из-за:

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

Каждый раз, когда i достигает current + after, оно уменьшается до pages - after, и этот цикл будет продолжаться бесконечно

2 голосов
/ 19 февраля 2010

Пожалуйста, исправьте after в after + 1 в 2 местах во всех местах вашего цикла, где вы его используете.

Кроме того, я не уверен, что ваш код будет работать правильно для крайних случаев (например, где current == 2) - вы можете проверить это

1 голос
/ 19 февраля 2010
  1. current + after здесь 39 (36 + 3), поэтому неудивительно, что вместо 39 отображается «...», увеличьте «после» на 1, чтобы исправить это
  2. после просмотракод в течение нескольких минут, я понятия не имею, почему он должен работать вечно :) Вы пытались написать «i» в консоли, чтобы проверить, какие значения он принимает и почему он никогда не достигает своего «окончательного значения»?
0 голосов
/ 04 ноября 2015

Следующий алгоритм дает 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;
}

.

0 голосов
/ 19 февраля 2010

Существует причина, по которой массивы используют индексацию с нуля в большинстве языков: математика проще. В вашем случае, поскольку вы, очевидно, не можете использовать индексирование на основе нуля, вам просто нужно исправить ошибки «по одному»:

else if(i == (current + after + 1)){
    i = (pages - after + 1);
    document.write('...');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...