This function can paginate an array of items:
function paginate(res,page,page_size,max_page_size) {
page=page||1;
page_size=page_size||10;
max_page_size=max_page_size||100;
page_size=page_size>max_page_size?max_page_size:page_size;
var pages=Math.round( res.length / page_size),
items=[];
for( var p=1; p <= pages; p++) {
var start= Math.round( page_size * (p-1) );
items.push( res.slice(start,start+page_size) );
}
return page < items.length?items[page-1]:items[ items.length-1 ];
}
having
- res = array
- page = current page
- page_size = number of items to be returned in a page
- max_page_size = max number of items for page
function paginate(res, page, page_size, max_page_size) {
page = page || 1;
page_size = page_size || 10;
max_page_size = max_page_size || 100;
page_size = page_size > max_page_size ? max_page_size : page_size;
var pages = Math.round(res.length / page_size),
items = [];
for (var p = 1; p <= pages; p++) {
var start = Math.round(page_size * (p - 1));
items.push(res.slice(start, start + page_size));
}
return page < items.length ? items[page - 1] : items[items.length - 1];
}
var list = Array.apply(null, Array(10)).map(function() {
return Array.apply(null, Array(Math.floor(Math.random() * 10 + 3))).map(function() {
return String.fromCharCode(Math.floor(Math.random() * (123 - 97) + 97));
}).join('')
});
console.log(list)
for (var i = 1; i < 8; i++) {
console.log("page", i, paginate(list, i, 2, 2))
}
This function has a bug, since as soon as it reaches the last paginated result, it returns always the same page. Why? Is there an alternative solution?
[UPDATE]
The issue was in the indexes calculation, this is the right version:
function paginate(res,page,page_size,max_page_size) {
page=page||1;
page_size=page_size||10;
max_page_size=max_page_size||100;
page_size=page_size>max_page_size?max_page_size:page_size;
var pages=Math.ceil( res.length / page_size),
items=[];
for( var p=1; p <= pages; p++) {
var start= page_size * (p-1)
items.push( res.slice(start,start+page_size) );
}
return page <= items.length?items[page-1]:[];
}
There were 2 errors: Math.round instead of Math.ceil and the last ternary operator page <= items.length?items[page-1]:[];
console.log("page", i, paginate(list, i, 2, 2))?8with2results for page, so you can see that, starting from the fifth element (we have 10 elements in the list), all the other three results are the same in the page.for (var i = 1; i < 8; i++)tofor (var i = 1; i <= list.length/2; i++)console.log(paginate(list, 5, 2, 2))andconsole.log(paginate(list, 6, 2, 2)), you will get always the same values.itemsfor anything larger thanitems.lengthwhich is 5. If you ask for page 5+, it will give you the last page which is 5 (items[4]). What are you expecting to return forpaginate(list, 6, 2, 2)?