我有一个间隔[0; max]
,我想将其拆分为特定数量的子间隔。为此,我编写了一个名为getIntervalls(max, nbIntervals)
的函数,其中max
是我第一个区间中的最大元素,nbIntervals
是预期子区间的数量。
例如:
getIntervalls(3, 2)
应该返回[[0,1], [2,3]]
,getIntervalls(6, 2)
应该返回[[0,3], [4,6]]
,getIntervalls(8, 3)
应该返回[[0,2], [3,5], [6,8]]
,getIntervalls(9, 3)
应该返回[[0,3], [4,7], [8,9]]
,这是我的功能:
function getIntervalls(max, nbIntervalls) {
var size = Math.ceil(max / nbIntervalls);
var result = [];
if (size > 1) {
for (let i = 0; i < nbIntervalls; i++) {
var inf = i + i * size;
var sup = inf + size < max ? inf + size: max;
result .push([inf, sup]);
}
} else {
result.push([0, max]);
}
return result;
}
console.log(JSON.stringify(getIntervalls(7, 2)));
它正常工作,并显示此输出:
[[0,4],[5,7]]
当我将参数更改为7和3时,它显示:
[[0,3],[4,7],[8,7]]
而不是
[[0,2],[3,5],[6,7]]
有人可以帮助我吗?先感谢您。 ES6语法将不胜感激! :)
答案 0 :(得分:4)
您需要使用Math.round()
获取最近的size
间隔的十进制数的整数。此外,您需要减少一个max
size
计算,以考虑有效的间隔数。
这里修改了你的代码:
function getIntervalls(max, nbIntervalls) {
var size = Math.round((max-1) / nbIntervalls);
var result = [];
for (let i = 0; i < nbIntervalls; i++) {
var inf = i + i * size;
var sup = inf + size < max ? inf + size: max;
result.push([inf, sup]);
if(inf >= max || sup >= max)break;
}
return result;
}
请注意它尊重所需的间隔数,因此可能会出现一些数字的情况
[..., [n-2,n-1], [n,n]]
。
希望这有帮助!
答案 1 :(得分:2)
您需要将尺寸计算从Math.ceil()
更改为Math.floor()
,因为ceil
所需的尺寸+1大于您的需要。
我已对您的代码进行了修改,此处可以使用。
function getIntervalls(max, nbIntervalls) {
var size = Math.floor(max / nbIntervalls);
var result = [];
if (size > 0) {
for (let i = 0; i < nbIntervalls; i++) {
var inf = i + i * size;
var sup = inf + size < max ? inf + size : max;
result .push([inf, sup]);
if (sup >= max) {
break;
}
}
} else {
result.push([0, max]);
}
return result;
}
console.log(JSON.stringify(getIntervalls(10, 5)));
希望这有帮助!
答案 2 :(得分:1)
您可以检查第一个元素的Microsoft.NETCore.UniversalWindowsPlatform
是否为零,如果下一个增量大于第二个元素的最大值。您还可以检查第一个元素是否小于最大值
i
&#13;