Paginate Javascript array

前端 未结 7 1813
庸人自扰
庸人自扰 2020-12-02 08:55

I am trying to write a Javascript function that takes an array, page_size and page_number as parameters and returns an array that mimi

相关标签:
7条回答
  • 2020-12-02 09:28

    I saw an example above that did this correctly (kind of) and wanted to expand on it.

    This was the example.

    function paginate(array, page_size, page_number) {
      // human-readable page numbers usually start with 1, so we reduce 1 in the first argument
      return array.slice((page_number - 1) * page_size, page_number * page_size);
    }
    

    There are a few things wrong with this.

    1.) If the page_number is 0 then it will try and set the starting split at -1 * page_size which returns an empty array. So the minimum value of the page_number attr should be 1, never anything less unless you handle that case in the function.

    2.) The starting and ending index of the split are the same. Because of this, you get back an empty array. So the split should be:

    return array.split(page_number * page_size, page_number * page_size + page_size)
    

    const myArray = [1,2,3,4,5,6,7,8,9,10];
    
    const paginateBad1 = (array, page_size, page_number) => {
      return array.slice((page_number - 1) * page_size, page_number * page_size);
    };
    
    const paginateBad2 = (array, page_size, page_number) => {
      return array.slice(page_number * page_size, page_number * page_size);
    };
    
    const paginateGood = (array, page_size, page_number) => {
      return array.slice(page_number * page_size, page_number * page_size + page_size);
    };
    
    console.log("Bad 1", paginateBad1(myArray, 2, 0));
    console.log("Bad 2", paginateBad2(myArray, 2, 1));
    console.log("Good", paginateGood(myArray, 2, 1));

    0 讨论(0)
  • 2020-12-02 09:37

    Here's a solution with reduce():

    function paginate (arr, size) {
      return arr.reduce((acc, val, i) => {
        let idx = Math.floor(i / size)
        let page = acc[idx] || (acc[idx] = [])
        page.push(val)
    
        return acc
      }, [])
    }
    
    let array = [1, 2, 3, 4, 5]
    let page_size = 2
    let pages = paginate(array, page_size)
    
    console.log(pages)    // all pages
    console.log(pages[1]) // second page

    It returns an array of pages so you can get a certain page, or loop through all of them.

    0 讨论(0)
  • 2020-12-02 09:42

    You can use Array.filter() with the help of its second parameter (the index of the current element being processed in the array).

    You'll also need the currently selected page and the number of items per page to display, so you can find the minimum and maximum index of the elements needed.

    const indexMin = selectedPage * elementsPerPage;
    const indexMax = indexMin + elementsPerPage;
    const paginatedArray = arrayToPaginate.filter(
      (x, index) => index >= indexMin && index < indexMax
    );
    

    Updating the selectedPage and/or the elementsPerPage value will allow to return the correct items to display.

    0 讨论(0)
  • 2020-12-02 09:44

    Another aproach that you can utilize, is using .filter, look:

    const paginate = function (array, index, size) {
            // transform values
            index = Math.abs(parseInt(index));
            index = index > 0 ? index - 1 : index;
            size = parseInt(size);
            size = size < 1 ? 1 : size;
    
            // filter
            return [...(array.filter((value, n) => {
                return (n >= (index * size)) && (n < ((index+1) * size))
            }))]
        }
    
    var array = [
      {id: "1"}, {id: "2"}, {id: "3"}, {id: "4"}, {id: "5"}, {id: "6"}, {id: "7"}, {id: "8"}, {id: "9"}, {id: "10"}
     ]
    
    
    var transform = paginate(array, 2, 5);
    
    console.log(transform) // [{"id":"6"},{"id":"7"},{"id":"8"},{"id":"9"},{"id":"10"}] 
    
    0 讨论(0)
  • 2020-12-02 09:49

    The use of Array#slice is the expected answer.

    Here I use Symbol.iterator to create an iterable.

    const arr = [1,2,3,4,5,6,7,8,9,10]
    
    function page({arr, pageSize, pageNumber}) {
        const start = pageSize*(pageNumber-1)
        const end = pageSize*pageNumber
        return {
            *[Symbol.iterator]() {
                for(let i = start; i < arr.length && i < end; i++) {
                    yield arr[i]
                }
            }
        }
    }
    
    console.log([...page({arr, pageSize: 5, pageNumber: 2})])

    0 讨论(0)
  • 2020-12-02 09:52

    You can use Array.prototype.slice and just supply the params for (start, end).

    function paginate(array, page_size, page_number) {
      // human-readable page numbers usually start with 1, so we reduce 1 in the first argument
      return array.slice((page_number - 1) * page_size, page_number * page_size);
    }
    
    console.log(paginate([1, 2, 3, 4, 5, 6], 2, 2));
    console.log(paginate([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 4, 1));

    0 讨论(0)
提交回复
热议问题