如何将一个字符串分割成 n 个字符的段?

311

如标题所述,我有一个字符串,想将其分成每个n个字符一段。

例如:

var str = 'abcdefghijkl';

经过一些神奇的操作,n=3 将变为

var arr = ['abc','def','ghi','jkl'];

有没有一种方法来做到这一点?


1
@ManoharReddyPoreddy,那个答案是错误的,因为其他人已经解释了。第一个答案非常详尽。 - akpi
@akpi 好的,我已经删除了我上面的评论(之前我推荐的答案可能没有评论,但对我很有效)。 - Manohar Reddy Poreddy
19个回答

1
这里有一种方法可以不使用正则表达式或显式循环来完成,尽管它有点扭曲了一个一行代码的定义:
const input = 'abcdefghijlkm';
    
// Change `3` to the desired split length.
const output = input.split('').reduce((s, c) => {
    let l = s.length-1; 
    (s[l] && s[l].length < 3) ? s[l] += c : s.push(c); 
    return s;
}, []);

console.log(output);  // output: [ 'abc', 'def', 'ghi', 'jlk', 'm' ]

它的工作原理是将字符串分割为单个字符的数组,然后使用Array.reduce迭代每个字符。通常情况下,reduce会返回一个单一的值,但在这种情况下,单一的值恰好是一个数组,当我们遍历每个字符时,我们将其附加到该数组中的最后一项。一旦数组中的最后一项达到目标长度,我们就会附加一个新的数组项。

1
function chunk(er){
return er.match(/.{1,75}/g).join('\n');
}

上面的函数是我用于Base64分块的。它将在每75个字符处创建一个换行符。

也可以使用 replace(/.{1,75}/g, '$&\n') - alex

1

在这里,我们将一个字符串与另一个字符串每n个字符交替出现:

export const intersperseString = (n: number, intersperseWith: string, str: string): string => {

  let ret = str.slice(0,n), remaining = str;

  while (remaining) {
    let v = remaining.slice(0, n);
    remaining = remaining.slice(v.length);
    ret += intersperseWith + v;
  }

  return ret;

};

如果我们这样使用上述内容:
console.log(splitString(3,'|', 'aagaegeage'));

我们得到:

aag|aag|aeg|eag|e

在这里我们做同样的事情,但是将其推入一个数组中:
export const sperseString = (n: number, str: string): Array<string> => {

  let ret = [], remaining = str;

  while (remaining) {
    let v = remaining.slice(0, n);
    remaining = remaining.slice(v.length);
    ret.push(v);
  }

  return ret;

};

然后运行它:

console.log(sperseString(5, 'foobarbaztruck'));

我们得到:

[ 'fooba', 'rbazt', 'ruck' ]

如果有人知道简化上述代码的方法,请告诉我,但它应该适用于字符串。

你的第一个代码片段没有按预期工作。我在这里进行了修改:https://jsfiddle.net/omarojo/ksvx2txb/261/ - omarojo

1

稍晚参与讨论,但这里有一个比子字符串+数组推送更快的变体。

// substring + array push + end precalc
var chunks = [];

for (var i = 0, e = 3, charsLength = str.length; i < charsLength; i += 3, e += 3) {
    chunks.push(str.substring(i, e));
}

在for循环的一部分中预先计算结束值比在substring内部进行内联数学计算更快。我已经在Firefox和Chrome中测试过它们都显示了加速效果。你可以在这里尝试它。

0
function str_split(string, length = 1) {
    if (0 >= length)
        length = 1;
    
    if (length == 1)
        return string.split('');

    var string_size = string.length;
    var result = [];

    for (let i = 0; i < string_size / length; i++)
        result[i] = string.substr(i * length, length);

    return result;
}

str_split(str, 3)

结果(Chrome 104)


0

我正在寻找一种将数字如1000000转换为1,000,000的解决方案,但绝对不想一直运行繁重的正则表达式操作,以减缓我的代码速度。

Alex的解决方案非常完美(在所有基于正则表达式的解决方案中!)。我已经修改并封装了一个函数,可以将数字格式化为千位分隔符数字:

function thouSep(str, delim=","){

    var chunks = [];
    str+=""

    for (var i = str.length; i >0; i -= 3) {
        chunks.push(str.substring(i-3, i));
    }
    
    f = chunks.reverse().join(delim)
    return f
}

使用方法:

thouSep(100000) => "100,000"
thouSep(10000)  =>  "10,000"
thouSep(10)     =>  "10"

thouSep(1000000)  =>  "1,000,000"

thouSep("Fabulous", "-") => "Fa-bul-ous"

可能的改进:

  1. 考虑小数: 12345.6789 => 12,345.6789
  2. 能够变化分段长度,而不仅仅是3秒。

0

function groupChars(str = "ABCDEFGHI",inGroupsOf = 3){
    let groups = [];
    for (let i = 0; i < str.length; i++) {
        (i%inGroupsOf) == 0 ? groups.push(str.slice(i,inGroupsOf + i)):null     
    }
    return groups;
}

console.log(groupChars("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));

函数groupChars接受两个参数 - strinGroupsOfinGroupsOf参数确定每个组包含的字符数
  1. 我们创建一个组数组 - let groups = [];
  2. 我们使用for循环遍历字符串
  3. 我们检查每个字符串的索引模inGroupsOf参数是否为零:(i % inGroupsOf) == 0;
  4. 如果为真,我们将值推入组数组中
  5. 我们从函数中返回组数组

0

一些不使用正则表达式的简洁解决方案:

/**
* Create array with maximum chunk length = maxPartSize
* It work safe also for shorter strings than part size
**/
function convertStringToArray(str, maxPartSize){

  const chunkArr = [];
  let leftStr = str;
  do {

    chunkArr.push(leftStr.substring(0, maxPartSize));
    leftStr = leftStr.substring(maxPartSize, leftStr.length);

  } while (leftStr.length > 0);

  return chunkArr;
};

使用示例 - https://jsfiddle.net/maciejsikora/b6xppj4q/

我还尝试将我的解决方案与正则表达式进行比较,后者被选为正确答案。一些测试可以在 jsfiddle 上找到 - https://jsfiddle.net/maciejsikora/2envahrk/。测试显示两种方法具有类似的性能,也许乍一看正则表达式解决方案略快,但请您自行判断。


-1
var b1 = ""; 

function myFunction(n) { 
  if(str.length>=3){
    var a = str.substring(0,n);
    b1 += a+ "\n"
    str = str.substring(n,str.length)
    myFunction(n) 
  } 
  else { 
    if(str.length>0){
      b1 += str 
    }
    
    console.log(b1)
  } 
}
      
myFunction(4)

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