首页 > 解决方案 > 范围数组,包括最小值、最大值和范围数

问题描述

我有一个数字范围,我想将其拆分为 n 个大小相等的范围。例子:

[min, max], n

0, 10, 5 = [[0, 2], [2, 4], [4, 6], [6, 8], [8, 10]]

所以我想构建一个函数,如:

function buckets(range, bucketsNumber) {
  const [min, max] = range
  const bucketRange = (max - min + 1) / bucketsNumber
  const res = _.range(1, bucketsNumber).map((i) => {
    const start = (idx) => bucketRange * (idx - 1) + min
    const end = start(i) + bucketRange - 1
    return [start(i), end]
  })
  return res
}

上面的函数不起作用,因为buckets([0, 10], 5)返回:

[
  [ 0, 1.2000000000000002 ],
  [ 2.2, 3.4000000000000004 ],
  [ 4.4, 5.6000000000000005 ],
  [ 6.6000000000000005, 7.800000000000001 ]
]

那个代码有什么问题? buckets应该也适用于负值range..

标签: javascriptlodash

解决方案


您可以存储最后一个正确的值并计算右侧的新值。

function buckets([min, max], length) {
    return Array.from(
         { length },
         ((t, f) => (_, i) => [t, t = ++i === length ? max : min + f * i])
             (min, (max - min) / length)
    );
}

console.log(buckets([0, 10], 5));


推荐阅读