【发布时间】:2018-03-02 21:38:07
【问题描述】:
这个函数可以对一个数组进行分页:
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 ];
}
拥有
- res = 数组
- page = 当前页面
- page_size = 页面中要返回的项目数
- max_page_size = 页面的最大项目数
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))
}
这个函数有一个错误,因为一旦它到达最后一个分页结果,它总是返回相同的页面。为什么?有其他解决方案吗?
[更新]
问题在于索引计算,这是正确的版本:
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]:[];
}
有 2 个错误:Math.round 而不是 Math.ceil 和最后一个三元运算符 page <= items.length?items[page-1]:[];
【问题讨论】:
-
你指的是你的最后一个for循环吗?
console.log("page", i, paginate(list, i, 2, 2))? -
@Matt 如果你看到索引最大值被设置为
8和2页面结果,所以你可以看到,从第五个元素开始(我们在列表中有10个元素),其他三个结果在页面中都是一样的。 -
将
for (var i = 1; i < 8; i++)更改为for (var i = 1; i <= list.length/2; i++) -
@matt 不,问题出在函数中,试试
console.log(paginate(list, 5, 2, 2))和console.log(paginate(list, 6, 2, 2)),你会得到相同的值。 -
您的退货被告知将
items的最后一个索引返回给您大于items.length的任何东西,即5。如果您要求第5页以上,它将给您最后一页是 5 (items[4])。您希望paginate(list, 6, 2, 2)返回什么?
标签: javascript arrays pagination