我想把一个非常大的字符串(比如10,000个字符)分割成n大小的块。

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

例如: "1234567890"除以2将变成["12","34","56","78","90"]。

使用string。prototype。match可以实现这样的事情吗如果可以,从性能来看,这是最好的方式吗?


当前回答

我对上述解决方案的问题是,不管在句子中的位置如何,它都将字符串划分为正式的大小块。

我认为下面的方法比较好;虽然它需要一些性能调整:

 static chunkString(str, length, size,delimiter='\n' ) {
        const result = [];
        for (let i = 0; i < str.length; i++) {
            const lastIndex = _.lastIndexOf(str, delimiter,size + i);
            result.push(str.substr(i, lastIndex - i));
            i = lastIndex;
        }
        return result;
    }

其他回答

这是一个解决方案,我想出了一个模板字符串后,一个小实验:

用法:

chunkString(5)`testing123`

函数chunkString(nSize) return (strToChunk) => { Let result = []; let chars = String(strToChunk).split("); 对于(设I = 0;i < (String(strToChunk)。length / nSize);我+ +){ result = result.concat(char .slice(i*nSize,(i+1)*nSize).join(")); } 返回结果 } } document . write (chunkString(5)“testing123”); //返回:testi,ng123 document . write (chunkString(3)“testing123”); //返回:tes,tin,g12,3

使用npm库"chkchars" 但是请记住,要确保给定的字符串长度完全除以“number”参数。

const phrase = "1110010111010011100101110100010000011100101110100111001011101001011101001110010111010001000001110010111010011100101110100"
const number = 7

chkchars.splitToChunks(phrase, number)

// result => ['1110010', '1110100','1110010', '1110100','0100000', '1110010','1110100', '1110010','1110100', '1011101','0011100', '1011101','0001000','0011100','1011101', '0011100','1011101']

// perf => 0.287ms

以原型函数的形式:

String.prototype.lsplit = function(){
    return this.match(new RegExp('.{1,'+ ((arguments.length==1)?(isFinite(String(arguments[0]).trim())?arguments[0]:false):1) +'}', 'g'));
}

你绝对可以做一些

let pieces = "1234567890 ".split(/(.{2})/).filter(x => x.length == 2);

要得到这个:

[ '12', '34', '56', '78', '90' ]

如果你想动态输入/调整数据块的大小,使数据块的大小为n,你可以这样做:

n = 2;
let pieces = "1234567890 ".split(new RegExp("(.{"+n.toString()+"})")).filter(x => x.length == n);

要在原始字符串中找到所有大小为n的块,尝试这样做:

let subs = new Set();
let n = 2;
let str = "1234567890 ";
let regex = new RegExp("(.{"+n.toString()+"})");     //set up regex expression dynamically encoded with n

for (let i = 0; i < n; i++){               //starting from all possible offsets from position 0 in the string
    let pieces = str.split(regex).filter(x => x.length == n);    //divide the string into chunks of size n...
    for (let p of pieces)                 //...and add the chunks to the set
        subs.add(p);
    str = str.substr(1);    //shift the string reading frame
}

你应该得到:

[ '12', '23', '34', '45', '56', '67', '78', '89', '90', '0 ' ]

你可以在没有正则表达式的情况下使用reduce():

(str, n) => {
  return str.split('').reduce(
    (acc, rec, index) => {
      return ((index % n) || !(index)) ? acc.concat(rec) : acc.concat(',', rec)
    },
    ''
  ).split(',')
}