在 JavaScript 中将大字符串拆分为 n 大小的块

2022-08-30 00:14:29

我想将一个非常大的字符串(假设是10,000个字符)拆分为N大小的块。

就性能而言,最好的方法是什么?

例如:被 2 拆分将变为 ."1234567890"["12", "34", "56", "78", "90"]

使用String.prototype.match是否可以实现这样的事情,如果是这样,这是否是性能方面实现的最佳方法?


答案 1

你可以做这样的事情:

"1234567890".match(/.{1,2}/g);
// Results in:
["12", "34", "56", "78", "90"]

该方法仍将适用于大小不是块大小的精确倍数的字符串:

"123456789".match(/.{1,2}/g);
// Results in:
["12", "34", "56", "78", "9"]

通常,对于要从中提取最多 n 大小的子字符串的任何字符串,您都可以执行以下操作:

str.match(/.{1,n}/g); // Replace n with the size of the substring

如果您的字符串可以包含换行符或回车符,则可以执行以下操作:

str.match(/(.|[\r\n]){1,n}/g); // Replace n with the size of the substring

就性能而言,我用大约10k个字符尝试了一下,在Chrome上花了一秒钟多一点的时间。新浪网.

这也可以用于可重用函数:

function chunkString(str, length) {
  return str.match(new RegExp('.{1,' + length + '}', 'g'));
}

答案 2

我创建了几个更快的变体,你可以在jsPerf上看到。我最喜欢的是这个:

function chunkSubstr(str, size) {
  const numChunks = Math.ceil(str.length / size)
  const chunks = new Array(numChunks)

  for (let i = 0, o = 0; i < numChunks; ++i, o += size) {
    chunks[i] = str.substr(o, size)
  }

  return chunks
}