首页 > 解决方案 > 创建数字数组的函数式方法

问题描述

在没有任何第三方库的情况下,如何使用 ES6 更有效地编写以下代码?

// sample pager array
// * output up to 11 pages
// * the current page in the middle, if page > 5
// * don't include pager < 1 or pager > lastPage
// * Expected output using example:
//     [9,10,11,12,13,14,15,16,17,18,19]

const page = 14 // by example
const lastPage = 40 // by example
const pagerPages = page => {
  let newArray = []
  for (let i = page - 5; i <= page + 5; i++) {
    i >= 1 && i <= lastPage ? newArray.push(i) : null
  }
  return newArray
}

我想避免 Array.push,可能还有 for 循环,但我不确定在这种情况下如何实现它。

标签: javascriptfunctional-programming

解决方案


  const pageRange = (lastPage, page) => ((start, end) => Array.from({length: end - start + 1}, (_,i) => i + start))(Math.max(1, page - 5), Math.min(lastPage, page + 5));
 const newArray = pageRange(40, 14);

这是一种纯粹的功能方法。它用于Math.max/min实现边界,然后使用 IIFE 传递这些边界Array.from,将创建一个元素数组end - start,这些元素中的每一个都将是数组中增加起始值的位置。


PS:国际海事组织你的代码实际上更简洁(除了不必要的三元组)并且比我的更具可读性,只是说......


推荐阅读