此函数可以对一组项目进行分页:
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 ];
}
具有
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))
}
&#13;
此函数有一个错误,因为只要它到达最后一个分页结果,它就会返回相同的页面。为什么?有替代解决方案吗?
[UPDATE]
问题在于索引计算,这是正确的版本:
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]:[];
答案 0 :(得分:1)
尚未确定您的代码的确切问题,但我记得在使用舍入函数时,当我到达数组末尾时保持状态并重置索引很困难。
最后,我只是制作了一个“chunker”来将数组划分为块并将其连接到使用previous()和next()方法渲染数组内容的东西,以获取正确的数组艺术。它在视图中实际代表哪个页面取决于要缓存的视图。
var Chunker = function Chunker( config ) {
if ( !Array.isArray( config.data ) ) {
throw new Error('chunker source is not an array');
return false;
}
this.data = config.data;
this.index = 0;
this.length = config.len || config.data.length; // Amount of items per chunk. When not defined, will return the entire array.
};
Chunker.prototype = {
'constructor' : Chunker,
'index' : function index( number ) { // => current index (getter) || => this (setter)
if ( number !== undefined ) {
this.index = index;
return this;
}
else return this.index;
},
'current' : function current() { // => { "index", "data" }
return {
"index" : this.index,
"data" : this.data.slice( this.index, this.index + this.length )
};
},
'next' : function next() { // => next chunk
this.index += this.length;
if ( this.index > this.data.length ) this.index = this.data.length - (this.data.length % this.length);
return this.current();
},
'previous' : function previous() { // => previous chunk
this.index -= this.length;
if (this.index < 0 ) this.index = 0;
return this.current();
},
'reset' : function reset() { // => this
this.index(0);
return this;
}
};