用#长度平均分割字符串

时间:2019-10-11 07:06:24

标签: javascript

我有一个字符串1234567890

我想将其每4个字符或n划分。

必须从字符串末尾开始

在上述情况下,它将为["12", "3456", "7890"]

123 => ["123"]

12345 => ["1","2345"]

我从这里找到了类似的答案,我进行了编辑,但没有用。

function getChunks(number, size) {
  let str = number.toString(),
      length = str.length - size + 1;
      
  return Array.from({ length }, (_,i) => +str.slice(i*size, (i*size) + size))
}

console.log(getChunks(1234,4));
console.log(getChunks(12345,4));
console.log(getChunks(123,4));
console.log(getChunks(1234567890,4));

2 个答案:

答案 0 :(得分:3)

一种快速的解决方法如下:

  • 您可以将String.prototype.slice()与索引-4一起使用,以获取字符串的最后4个字符。
  • 使用str更新原始字符串str.slice(0,-4),以删除最后四个字符。
  • 重复相同的步骤,直到str.length0。循环中的最后一个str的长度不能超过4个字符,并且不会影响String.prototype.slice()的使用。
  • 最后,使用Array.prototype.reverse()对数组进行正确排序。

let str = "1234567890";
let segments = [];

while (str.length) {
  segments.push(str.slice(-4));
  str = str.slice(0, -4);
}
segments.reverse();
console.log(segments);

答案 1 :(得分:1)

要更正您的初始代码,它有两个问题。

  1. 新数组的派生长度是错误的-str.length - size + 1将为您提供错误的结果。假设str.length === 10size = 4,那将是10 - 4 + 1,这将为您提供7
    • 实际长度应该是您可以将size放入str.length的次数。您还需要四舍五入。因此,str.length === 8size === 4将产生2,而str.length === 10size === 43
    • 公式为Math.ceil(str.length / size)
  2. str.slice(i*size, (i*size) + size)完成的分块试图使前一组尽可能大,而最后一组可能较小。而您需要相反效果-最后一组应尽可能小,第一个组将具有足够的项目来容纳剩下的所有内容。
    • 确定“还剩下什么”的方法是使用the remainder operator,例如10 % 4 === 2。因此,第一组必须包含两个项目。由于这确定了组的 size ,因此这意味着必须将其作为起始索引和结束索引的偏移量来考虑。不幸的是,这使公式变得非常烦人-您需要一个{em}的 maximum 差异和一个size minimum 差异。第一个起点应始终为remainder,第一个终点应为0,然后每个后续迭代中,都需要在起点和终点都添加remainder。但是,第一个和第二个 size索引可以小于start。正如我所说的那样,烦人,所以您想要的公式是
    • size-对于start = Math.max(0, size*(i - 1) + remainder),您可以变为负数,但将其最小限为零。您将从i = 0开始第二次迭代。因此进度为remainder,依此类推。
    • 0 -> remainder -> remainder + size -> remainder + size + size-将end = remainder + size * i添加为偏移量,每次仅增加remainder。进度为size等。
    • remainder -> remainder + size -> remainder + size + size-非常重要,但留在最后。我认为,一旦您知道remainder = (str.length % size) || sizestart的工作原理,它就会更加有意义。 end的这个定义解决了remainderstr.length完全整除时会发生的问题。在不使用size而不是size的情况下,您会遇到0str.length === 4的问题,size === 4公式会给我们end。因此,换句话说,因此我们必须将其定义为0

所有这些都会产生更正的版本:

0 > remainder >= size

我只想显示原始版本在工作时的外观。我不会诚实地推荐它,因为它不容易阅读。有多种方法可以重新排列公式,但总体上还是不太直观。