javascript 将数字范围拆分为特定数量的间隔

zmeyuzjn  于 2023-01-04  发布在  Java
关注(0)|答案(4)|浏览(226)

我有一个区间[0; max],我想把它分割成一定数量的子区间,为此,我写了一个函数getIntervalls(max, nbIntervals),其中max是第一个区间中的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语法将会很感激!:)

jk9hmnmh

jk9hmnmh1#

您需要使用Math.round()来获取间隔size的小数的最接近整数。此外,您需要将max减1,以便计算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]].
希望这有帮助!

cygmwpex

cygmwpex2#

您可以检查第一个元素的i是否为零,第二个元素的下一个增量是否大于最大值,也可以检查第一个元素是否小于最大值。

function getIntervalls(max, nInt) {
  const c = Math.floor(max / nInt);
  const r = [];
  for (var i = 0; i <= max; i += c) {
    const a = i == 0 ? i : i += 1;
    const b = i + c > max ? max : i + c;
    if (a < max) r.push([a, b])
  }
  return r;
}

console.log(JSON.stringify(getIntervalls(3, 2)));
console.log(JSON.stringify(getIntervalls(6, 2)));
console.log(JSON.stringify(getIntervalls(8, 3)));
console.log(JSON.stringify(getIntervalls(9, 3)));
console.log(JSON.stringify(getIntervalls(7, 2)));
console.log(JSON.stringify(getIntervalls(7, 3)));
mgdq6dx1

mgdq6dx13#

您需要将大小计算从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)));

希望这有帮助!

m4pnthwp

m4pnthwp4#

对我来说,这是一个完美的功能。
它可以让你得到两个数字之间的间隔,最后一个间隔总是达到最大值。

function getIntervals(min, max, nbIntervals) {
    let size = Math.floor((max - min) / nbIntervals);
    let result = [];

    if (size <= 0) return [min, max];

    for (let i = 0; i < nbIntervals; i++) {
        let inf = min + (i * size);
        let sup = ((inf + size) < max) ? inf + size : max;

        if (i === (nbIntervals - 1)) {
            if (sup < max) sup = max;
        }

        result.push([inf, sup]);

        if (sup >= max) break;
    }

    return result;
}

相关问题