正如标题所说,我有一个字符串,我想把它分成n个字符的片段。

例如:

var str = 'abcdefghijkl';

当n=3时,它会变成

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

有办法做到这一点吗?


当前回答

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

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

其他回答

如果你不想使用正则表达式…

var chunks = [];

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

jsFiddle。

...否则正则表达式的解决方案是相当好的:)

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

/**
* 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/。

我还尝试将我的解决方案与被选为正确答案的regexp进行比较。可以在jsfiddle - https://jsfiddle.net/maciejsikora/2envahrk/上找到一些测试。测试表明这两种方法具有相似的性能,可能乍一看regexp解决方案稍微快一点,但请自行判断。

这里我们每隔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'));

我们得到:

亚美大陆煤层气有限公司|亚美大陆煤层气有限公司| aeg |坚毅不屈| e

这里我们做同样的事情,但是push到一个数组:

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”]

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

const chunkStr = (str, n, acc) => {     
    if (str.length === 0) {
        return acc
    } else {
        acc.push(str.substring(0, n));
        return chunkStr(str.substring(n), n, acc);
    }
}
const str = 'abcdefghijkl';
const splittedString = chunkStr(str, 3, []);

干净的解决方案没有REGEX

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)

基准测试:http://jsben.ch/HkjlU(不同浏览器的结果不同)

结果(Chrome 104)