最小值、最大值和范围数的范围数组
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。所以 min
和 max
分别获得第一个(索引 0
)。参数数组的第二个元素
Array.from({length: bucketsNumber})
创建一个长度为 bucketsNumber
的数组
@see Array.from
- 这个数组将被映射到一个returned
的新数组
- 映射是由一个函数完成的,该函数将 return 一个数组数组,每个数组有两个数字(
min + idx * step
和 min + (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
)
我有一个数字范围,我想将其分成 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。所以min
和max
分别获得第一个(索引0
)。参数数组的第二个元素Array.from({length: bucketsNumber})
创建一个长度为bucketsNumber
的数组 @see Array.from- 这个数组将被映射到一个returned 的新数组
- 映射是由一个函数完成的,该函数将 return 一个数组数组,每个数组有两个数字(
min + idx * step
和min + (idx + 1) * step
)。min
取自函数参数中的调用函数 (@cf Closures),idx
is the automatic index of the current element of the array through themap
parameters, andstep
is calculated as default parameter (step = (max - min) / bucketsNumber
)