Javascript 将字符串等分为#长度

Javascript 将字符串等分为#长度,javascript,Javascript,我有一个字符串1234567890 我想每4个字符或n个字符将其分开 必须从字符串末尾开始分割 在上述情况下,它将是[“12”、“3456”、“7890”] 123=>[“123”] 12345=>[“1”、“2345”] 我在这里找到了一些类似的答案,我编辑了它,但它不起作用 函数getChunks(数量、大小){ 设str=number.toString(), 长度=长度-尺寸+1; 返回数组.from({length},(u,i)=>+str.slice(i*size,(i*size)+

我有一个字符串
1234567890

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

必须从字符串末尾开始分割

在上述情况下,它将是
[“12”、“3456”、“7890”]

123
=>
[“123”]

12345
=>
[“1”、“2345”]

我在这里找到了一些类似的答案,我编辑了它,但它不起作用

函数getChunks(数量、大小){
设str=number.toString(),
长度=长度-尺寸+1;
返回数组.from({length},(u,i)=>+str.slice(i*size,(i*size)+size))
}
log(getChunks(1234,4));
log(getChunks(12345,4));
log(getChunks(123,4));

log(getChunks(1234567890,4))快速解决方案如下:

  • 您可以使用索引为
    -4
    来获取字符串的最后4个字符
  • 使用
    str.slice(0,-4)
    更新原始字符串
    str
    ,以删除最后四个字符
  • 重复相同的步骤,直到
    str.length
    0
    。循环中的最后一个
    str
    长度可以小于4个字符,并且不会影响
    String.prototype.slice()
    的使用
  • 最后,使用以正确地重新排列数组
let str=“1234567890”;
设分段=[];
while(str.length){
推(str.slice(-4));
str=str.slice(0,-4);
}
段。反向();

控制台日志(段)要更正初始代码,它有两个问题

  • 新数组的派生长度错误-
    str.length-size+1
    将给出错误的结果。假设
    str.length==10
    size=4
    ,那么这将是
    10-4+1
    ,它将为您提供
    7
    • 实际长度应该是
      size
      放入
      str.length
      的次数。你还需要集中精力。因此,
      str.length==8
      size==4
      将导致
      2
      ,而
      str.length==10
      size==4
      3
    • 公式是
      Math.ceil(str.length/size)
  • 使用
    str.slice(i*size,(i*size)+size)
    进行的分块尝试使第一组尽可能大,最后一组可能小。然而,你需要相反的效果——最后一组应该尽可能小,第一组应该有足够的物品来容纳剩下的任何东西。
    • 确定“剩下什么”的方法是使用,例如,
      10%4==2
      。因此,第一组必须由两个项目组成。由于这决定了组的大小,这意味着它必须作为起始索引和结束索引的偏移量来考虑。不幸的是,这使得推导公式非常烦人-您需要最大差值
      大小
      ,最小差值
      余数
      。第一个开始应该始终是
      0
      ,第一个结束
      余数
      ,然后每次后续迭代,您都需要在开始和结束处添加
      大小
      。但是,第一个和第二个
      开始
      索引可以小于
      大小
      。就像我说的,讨厌,所以你想要的公式是
    • start=Math.max(0,size*(i-1)+余数)
      -对于
      i=0,可以取负数,但可以将其钳制为最小值为零。第二次迭代从
      余数开始。因此,进程是
      0->余数->余数+大小->余数+大小
      等等
    • end=余数+大小*i
      -添加
      余数
      作为偏移量,每次仅增加
      大小
      。进程是
      rements->rements+size->rements+size+size
    • 余数=(str.length%size)| | size
      -非常重要,但留到最后。我认为,一旦你知道了
      开始
      结束
      是如何工作的,这就更有意义了。
      余数的这个定义解决了当
      str.length
      完全可以被
      大小整除时会出现的问题。如果不使用
      size
      而不是
      0
      ,您将遇到
      str.length==4
      size==4
      的问题
      end
      公式将给出
      0
      。因此,换句话说,我们必须将其定义为
      0>余数>=size
  • 所有这些都会生成正确的版本:

    函数getChunks(数量、大小){
    设str=number.toString(),
    长度=数学单元(长度/尺寸);
    让余数=(str.length%size)| size;
    返回数组。from({length},(1;,i)=>{
    让start=Math.max(0,size*(i-1)+余数);
    让结束=余数+大小*i;
    return+str.slice(
    开始
    结束
    )
    })
    }
    log(getChunks(1234,4));
    log(getChunks(12345,4));
    log(getChunks(12345678,4));
    log(getChunks(123,4));
    
    log(getChunks(1234567890,4))
    @zynkn如果你在很长一段时间内经常这样做,你就会习惯于不费吹灰之力就做这样的事情。熟能生巧!:)哇,看起来像一篇论文。我会阅读并努力理解它。非常感谢你。