我想将一个非常大的字符串(比如 10,000 个字符)拆分为 N 大小的块。
就性能而言,这样做的最佳方法是什么?
例如:
"1234567890"
被 2 分割将变成["12", "34", "56", "78", "90"]
。
是否可以使用String.prototype.match
这样的东西,如果可以,这是否是性能方面的最佳方法?
我想将一个非常大的字符串(比如 10,000 个字符)拆分为 N 大小的块。
就性能而言,这样做的最佳方法是什么?
例如:
"1234567890"
被 2 分割将变成["12", "34", "56", "78", "90"]
。
是否可以使用String.prototype.match
这样的东西,如果可以,这是否是性能方面的最佳方法?
你可以这样做:
"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'));
}
我创建了几个更快的变体,您可以在 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
}
底线:
match
效率很低,slice
更好,在 Firefox 上substr
/substring
还是更好match
对于短字符串效率更低(即使使用缓存的正则表达式 - 可能是由于正则表达式解析设置时间)match
对于大块大小甚至效率更低(可能是由于无法“跳转”)match
表现优于slice
但在所有其他系统上仍然失败这是一个快速而直接的解决方案 -
function chunkString (str, len) {
const size = Math.ceil(str.length/len)
const r = Array(size)
let offset = 0
for (let i = 0; i < size; i++) {
r[i] = str.substr(offset, len)
offset += len
}
return r
}
console.log(chunkString("helloworld", 3))
// => [ "hel", "low", "orl", "d" ]
// 10,000 char string
const bigString = "helloworld".repeat(1000)
console.time("perf")
const result = chunkString(bigString, 3)
console.timeEnd("perf")
console.log(result)
// => perf: 0.385 ms
// => [ "hel", "low", "orl", "dhe", "llo", "wor", ... ]
惊喜!您可以使用split进行拆分。
var parts = "1234567890 ".split(/(.{2})/).filter(O=>O)
结果是 [ '12', '34', '56', '78', '90', ' ' ]