I needed a relatively simple pagination, as currently implemented on GoogleSearch (sans prev & next buttons). Most code I've seen was overly complicated so I came up with something that's simpler.
Any suggestions on how to further optimise this?
function doPaging(currentPageInput) {
let currentPage = currentPageInput, // input
range = 5, // amount of links displayed
totalPages = 20, // determined by amount of items, hardcoded for readability
start = 1; // default
let paging = []; // output variable
// Don't use negative values, force start at 1
if (currentPage < (range / 2) + 1 ) {
start = 1;
// Don't go beyond the last page
} else if (currentPage >= (totalPages - (range / 2) )) {
start = Math.floor(totalPages - range + 1);
} else {
start = (currentPage - Math.floor(range / 2));
}
for (let i = start; i <= ((start + range) - 1); i++) {
if (i === currentPage) {
paging.push(`[${i}]`); // add brackets to indicate current page
} else {
paging.push(i.toString());
}
}
return paging;
}
OUTPUT:
[ '[1]', '2', '3', '4', '5' ]
[ '1', '[2]', '3', '4', '5' ]
[ '1', '2', '[3]', '4', '5' ]
[ '2', '3', '[4]', '5', '6' ]
[ '3', '4', '[5]', '6', '7' ]
[ '4', '5', '[6]', '7', '8' ]
[ '5', '6', '[7]', '8', '9' ]
[ '6', '7', '[8]', '9', '10' ]
[ '7', '8', '[9]', '10', '11' ]
[ '8', '9', '[10]', '11', '12' ]
[ '9', '10', '[11]', '12', '13' ]
[ '10', '11', '[12]', '13', '14' ]
[ '11', '12', '[13]', '14', '15' ]
[ '12', '13', '[14]', '15', '16' ]
[ '13', '14', '[15]', '16', '17' ]
[ '14', '15', '[16]', '17', '18' ]
[ '15', '16', '[17]', '18', '19' ]
[ '16', '17', '[18]', '19', '20' ]
[ '16', '17', '18', '[19]', '20' ]
[ '16', '17', '18', '19', '[20]' ]