【问题标题】:Generate reversed range with supplied bounds使用提供的边界生成反向范围
【发布时间】:2020-09-29 03:13:37
【问题描述】:

此问题与现有问题类似:Create array of all integers between two numbers, inclusive, in Javascript/jQuery

但是,我不想简单地生成两个边界 minmax 之间的范围,而是使用指定的 limit 创建数字 startend 之间的范围。

示例:

start 19
end 30
limit 60

结果: [19, 20, 21, 22, ..., 28, 29, 30]


start 30   end 19       limit 60

结果: [30, 31, 32, ..., 58, 59, 60, 1, 2, 3, ..., 17, 18, 19]

注意:数组的任何元素都不能大于limit

我猜我还必须定义一个下限(在这种情况下为 1 以排除数组中的零)。

如何在普通的 ES6 中实现这一点?

【问题讨论】:

  • start : 10 , end : 20 ,limit : 15 值的结果是什么?
  • @EhsanNazeri 那将是 [10, 11, ..., 14, 15] - limit 在这种情况下应该具有最高优先级(任何数字都不能大于 limit
  • 那么if (start > end) return [...range(start, limit), ...range(0, end)] else return range(start, end)?
  • @Bergi 哈哈,我喜欢人们如何将一开始看起来很困难的问题变成一个非常简单的问题!对,就是这样
  • @Bergi 有问题。把它改成这个if (start > end) return [...range(start, limit), ...range(0, end)] else return range(start, Math.min([end,limit])

标签: javascript ecmascript-6 range


【解决方案1】:

这是我的实现,也许不是最好的,但它有效。

它使用Math.sign(end-start)确定范围的方向,并具有minmax参数:

const range = ({
  start,
  end,
  min = -Infinity,
  max = Infinity
}) => {
  if(Math.floor(start) !== start || Math.floor(end) !== end) throw new Error('Invalid numbers')
  const 
    sign = Math.sign(end - start),
    arr = [],
    push = n => {
      if (min <= n && n <= max) arr.push(n)
    }
  for (let n = start; n !== end; n += sign)
    push(n)
  push(end)
  return arr
}

console.log(range({start: 30, end: 19, max: 60}))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    • 2017-09-09
    相关资源
    最近更新 更多