首页 > 解决方案 > 范围从 n 在两个方向

问题描述

鉴于let n = 9,我想回来[6, 7, 8, 9, 10, 11, 12]。我知道我可以这样写:

const up = [...Array(4).keys()].map(i => i + 9)
const down = [...Array(4).keys()].map(i => 9 - i).reverse()
const result = [...new Set([...down, ...up])]

但是如果n更改为1我只想返回正数。如果没有一堆if陈述,我该怎么做?有没有更有效的方法来写这个?如果您无法分辨,这是给分页器的。

标签: javascript

解决方案


您可以使用Array.filter()过滤掉超出最小和最大页码的值。为方便起见,将其放入函数中:

const paginate = function(num, pages, min, max) {
  const up = [...Array(pages - 1).keys()].map(i => num + i + 1).filter(i => i <= max);
  const down = [...Array(pages - 1).keys()].reverse().map(i => num - i - 1).filter(i => i >= min);
  return [...down, num, ...up];
}

console.log(paginate(5, 4, 1, 10));
console.log(paginate(9, 4, 1, 10));
console.log(paginate(1, 4, 1, 10));

这可以简化为:

const paginate = (num, pages, min, max) =>
  [...Array(pages * 2 - 1).keys()].map(i => num + 1 - pages + i).filter(i => i <= max && i >= min);

console.log(paginate(5, 4, 1, 10));
console.log(paginate(9, 4, 1, 10));
console.log(paginate(1, 4, 1, 10));


推荐阅读