javascript - 创建数字数组的函数式方法
问题描述
在没有任何第三方库的情况下,如何使用 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 循环,但我不确定在这种情况下如何实现它。
解决方案
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:国际海事组织你的代码实际上更简洁(除了不必要的三元组)并且比我的更具可读性,只是说......
推荐阅读
- react-native - 如何在 React-Native 中导出和导入用户 ID
- unit-testing - 在 Kafka Streams 中测试交互式查询
- configuration - 如何在 pylint 的 msg-template 中包含文件 url?
- scikit-learn - simpleimputer 没有处理我的数据
- python - 如何删除熊猫中的毫秒和相关数据
- sql - 用单表选择填空
- flutter - 我应该使用final,但是如果我需要修改一些东西怎么办?
- javascript - ReactJS 中的 Firebase 自定义声明 || 显示管理 UI
- java - 将包含浮点值的大型 CSV 或 Excel 文件传递给 Java MappedByteBuffer,而不必逐行或逐行分隔值
- docusaurus - 带有 Docusaurus 2 的每个文档页面的自定义主题