如何在JavaScript中将数字分成最大100的块?

3

我有一个数字(假设是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不是最好的方法,但那是我能想到的。有没有其他方式可以改进我的代码并使其更有效率?


只需交换while循环内的2行代码的顺序即可。 - RJM
请阅读在什么情况下我可以在我的问题中添加“紧急”或其他类似短语,以便获得更快的答案? - 总结是这不是一个理想的方式来处理志愿者,并且可能会适得其反,导致无法获得答案。请不要在您的问题中添加此内容。 - halfer
6个回答

9
你可以计算出 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。 - Ori Drori
是的,它会在末尾添加一个额外的“0”。 - Hunter McMillen

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 允许我,我会将其标记为答案。 - Jacob Gunther

1

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

const number = 525;
const max = 100;

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

0

显然,我对这种问题的看法完全不同。我会将数字除以段大小并向下舍入/截断以获取节的数量,将那么多个节添加到最终数组中,然后将段大小和数字的模数作为最终值添加。

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


0
这里的问题是你在将数字添加到数组后,又减去了100。
代码应该像这样:
var number = 525;
var array = [];
while (number > 0) {
  array.push(Math.min(number, 100));
  number = number - 100;
}

0

你也可以使用模数。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接