前段时候写IM即时通讯的时候,要对用户的聊天记录进行分页,于是就写了一个对聊天记录进行分页的公告函数,嗯,的确很好用!
eg:
第一步
首先要考虑这个对数组进行分页的函数要接收的参数,在此我的是:
- pageNo: 要获取的页码
- pageSize: 每页数量
- origin: 要进行分页的数组
function pagination (pageNo, pageSize, origin) { }
第二步
有了这三个参数,我们已经可以实现数组分页了,再此我主要使用的是 JS 数组的 slice 方法,因为 splice 的话,会改变原数组。
slice() 方法可从已有的数组中返回选定的元素。
语法
arrayObject.slice(start,end)
- start:必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
- end:可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。
首先我们需要确定切片的起始位置,因为是从0开始,所以需要减1,然后用得到的结果乘以pageSize每页数量就可以得到分页的起始位置。
得到了 pageSize 之后,我们只需要得到 end 切片终止位置即可。
用起始位置加上pageSize就可以得到。
function pagination (pageNo, pageSize, origin) { // 获取切片的起始位置 const originSection = (pageNo - 1) * pageSize const currentPage = origin.slice(originSection, originSection + pageSize) }
PS: 如果要切的起始位置大于当前数组的总长度,是切不到的,只会得到空数组,所以我们不需要做多余处理。
核心已经实现了,接下来稍微完善一下即可;我们可以把总页数,总长度等一并返回:
源码;
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <meta content="Microsoft FrontPage 4.0"> <meta content="FrontPage.Editor.Document"> <title></title> </head> <body> <script type="text/javascript"> let arr = [] for (let i = 1; i < 300; i++) { arr.push(i) } /** * @param {Number} pageNo: 页码 * @param {Number} pageSize: 每页数量 * @param {Array} origin: 要分页的数组 */ function pagination (pageNo, pageSize, origin) { // 获取切片的起始位置 const originSection = (pageNo - 1) * pageSize // 判断起始切片加要切的元素数量加在一起是否大于数组的长度,如果大于,说明没有更多历史记录了,返回空数组即可或者返回 const currentPage = origin.slice(originSection, originSection + pageSize) return { currentPage: pageNo, data: currentPage, last_page: Math.ceil(origin.length/pageSize), // 总页数(最后一页) per_page: pageSize, total: origin.length } } console.log(pagination(20, 10, arr)) </script> </body> </html>