最小值、最大值和范围数的范围数组

Array of ranges from min, max and number of ranges

我有一个数字范围,我想将其分成 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) returns:

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

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

一个简单的递归使这变得非常容易。我们计算第一个桶的末尾,然后简单地包括 [min, end] 并在剩余范围和少一个桶上重复,当我们没有剩余桶可计算时停止。

const buckets = ([min, max], n, end = min + (max - min) / n) =>
  n == 0
    ? []
    : [[min, end], ... buckets([end, max], n - 1)]

console .log (buckets ([0, 10], 5))
.as-console-wrapper {max-height: 100% !important; top: 0}

我认为我们需要一个示例来处理您的“负范围值”。这应该可以很好地处理负数,但如果你的意思是“当 min > max”,那么我认为我们需要更多信息。

修正了数学问题。谢谢斯科特

let n=5, min = 2, 
next = min
const range  = Array.from({length: n}, (_, i) => [min * i, min * i + next]);
console.log(range)

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

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));

你不需要 lodash。

bucket = ([min, max], bucketsNumber) => 
  Array.from({length: bucketsNumber}).map((el, idx, arr, step = (max - min) / bucketsNumber) => [min + idx * step, min + (idx + 1) * step])
  

console.log(0,10,5,bucket([0, 10], 5));
console.log(0,20,4,bucket([0, 20], 4));
console.log(-10,10,2,bucket([-10, 10], 2));
console.log(10,-10,4,bucket([10, -10], 4));

编辑

这是做什么的:

  • [min, max]中的Arrow Function's parameter list is Array Deconstruction。所以 minmax 分别获得第一个(索引 0)。参数数组的第二个元素
  • Array.from({length: bucketsNumber}) 创建一个长度为 bucketsNumber
    的数组 @see Array.from
  • 这个数组将被映射到一个returned
  • 的新数组
  • 映射是由一个函数完成的,该函数将 return 一个数组数组,每个数组有两个数字(min + idx * stepmin + (idx + 1) * step)。 min 取自函数参数中的调用函数 (@cf Closures), idx is the automatic index of the current element of the array through the map parameters, and step is calculated as default parameter (step = (max - min) / bucketsNumber)