【问题标题】:How do I split a number into chunks of max 100 in JavaScript?如何在 JavaScript 中将一个数字分成最多 100 个的块?
【发布时间】:2017-12-04 22:25:15
【问题描述】:

我有一个号码(比如说 525)。我想把这个数字分成一个块数组,每个值最多 100 个。如果我把525 拆分成一个数组,它看起来像:

[
    100,
    100,
    100,
    100,
    100,
    25
]

这是我迄今为止尝试过的:

var number = 525;
var array = [];
while (number > 0) {
    number = number - 100;
    array.push(Math.min(number, 100));
}

这并没有让我走得太远。它只返回[ 100, 100, 100, 100, 25, -75 ]。我知道使用while 不是最好的方法,但这是我能想到的。有没有人有任何其他方法可以改进我的代码并提高效率?

【问题讨论】:

标签: javascript arrays split integer


【解决方案1】:

你应该在你按下数字后移动number = number - 100;这一行,这样它就会计算第一个100,并在按下-75之前停止:

var number = 525;
var array = [];
while (number > 0) {
  array.push(Math.min(number, 100));
  number = number - 100; // remove number after pushing
}

console.log(array);

还有一个使用Array#from的花哨的:

const number = 525;

const get100s = (number) => Array.from({ length: Math.ceil(number / 100) }, (_, i) => {
  const leftover = number - i * 100;
  
  return leftover > 100 ? 100 : leftover;
});

console.log('525: ', get100s(525));
console.log('500: ', get100s(500));
console.log('10: ', get100s(10));

【讨论】:

  • 谢谢!它完美地工作!只要 Stack Overflow 允许,我就会将其标记为答案。
【解决方案2】:

或者,您可以使用整数除法来获取“max”除数的出现次数,然后使用“mod”操作来获取最终块或余数。

const number = 525;
const max = 100;

const maxCount = Math.floor(number / max); // 5
const remainder = 525 % max; // 25

【讨论】:

    【解决方案3】:

    您可以计算出number100 整除的次数,然后以编程方式创建该长度的数组:

    var number = 525;
    var array = new Array(Math.floor(number / 100)).fill(100).concat(number % 100))
    // [ 100, 100, 100, 100, 100, 25 ]
    

    您可以将其扩展到任意数量的块:

    function chunkBy(number, n) {
      var chunks = Array(Math.floor(number / n)).fill(n);
      var remainder = number % n;
    
      if (remainder > 0) {
        chunks.append(remainder);
      }
      return chunks;
    }
    

    或者,在执行减法之前简单地推动元素:

    var number = 525;
    var array = [];
    while (number > 0) {
        array.push(Math.min(number, 100));
        number = number - 100;
    }
    // [ 100, 100, 100, 100, 100, 25 ]
    

    在 ES6 中使用箭头函数:

    const chunkBy = (n) => number => {
      var chunks = new Array(Math.floor(number / n)).fill(n);
      var remainder = number % n;
      console.log('CHUNKS = ', chunks);
      if (remainder > 0) {
        chunks.push(remainder);
      }
    
      return chunks;
    };
    
    const chunkBy50 = chunkBy(50);
    const chunkBy100 = chunkBy(100);
    const chunkBy77 = chunkBy(77);
    console.log(chunkBy50(500));
    // [ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50 ]
    console.log(chunkBy100(500));
    // [ 100, 100, 100, 100, 100 ]
    console.log(chunkBy77(500));
    // [ 77, 77, 77, 77, 77, 77, 38 ]
    

    【讨论】:

    • 您的回答中的一个问题是,当数字可以被 0 整除时会发生什么 - 例如 500。
    • 它会在最后添加一个额外的0,是的,
    【解决方案4】:

    这里的问题是,在将数字添加到数组后,您要减去 100。

    代码应该是这样的:

    var number = 525;
    var array = [];
    while (number > 0) {
      array.push(Math.min(number, 100));
      number = number - 100;
    }
    

    【讨论】:

      【解决方案5】:

      显然我对这类问题的看法完全不同。我会将数字除以部分大小并向下舍入/截断以获得部分数量,将许多部分添加到最终数组中,然后将部分大小的模数和数字添加为最终值。

      var value = 525;
      
      function splitValue(val, sectionSize)
      {
        var sections = Math.floor(val/sectionSize);
        var finalValue = val%sectionSize;
        var splitValues = [];
        
        for (var i = 0; i < sections; i++) {
          splitValues.push(sectionSize);
        }
        
        splitValues.push(finalValue);
        
        return splitValues;
      }
      
      var valueArray = splitValue(value, 100);
      
      console.log(valueArray);

      【讨论】:

        【解决方案6】:

        您也可以使用模数。

        let x = 556;
        let mod = 100; 
        let res = [];
        for (let i = 0; i < parseInt(x / mod); i++) res.push(mod);
        res.push(x % mod);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-15
          • 1970-01-01
          • 1970-01-01
          • 2022-10-13
          • 1970-01-01
          • 2022-12-05
          相关资源
          最近更新 更多