Reputation: 2719
I would like to split a string into fixed-length (N, for example) pieces. Of course, last piece could be shorter, if original string's length is not multiple of N.
I need the fastest method to do it, but also the simplest to write. The way I have been doing it until now is the following:
var a = 'aaaabbbbccccee';
var b = [];
for(var i = 4; i < a.length; i += 4){ // length 4, for example
b.push(a.slice(i-4, i));
}
b.push(a.slice(a.length - (4 - a.length % 4))); // last fragment
I think there must be a better way to do what I want. But I don't want extra modules or libraries, just simple JavaScript if it's possible.
Before ask, I have seen some solutions to resolve this problem using other languages, but they are not designed with JavaScript in mind.
Upvotes: 27
Views: 26280
Reputation: 13031
function stringToChanks(string, chunkSize) {
const chunks = [];
while (string.length > 0) {
chunks.push(string.substring(0, chunkSize));
string = string.substring(chunkSize, string.length);
}
return chunks
}
Upvotes: 1
Reputation: 11342
You can try this:
var a = 'aaaabbbbccccee';
var b = a.match(/(.{1,4})/g);
Upvotes: 49
Reputation: 91094
See this related question: https://stackoverflow.com/a/10456644/711085 and https://stackoverflow.com/a/8495740/711085 (See performance test in comments if performance is an issue.)
First (slower) link:
[].concat.apply([],
a.split('').map(function(x,i){ return i%4 ? [] : a.slice(i,i+4) })
)
As a string prototype:
String.prototype.chunk = function(size) {
return [].concat.apply([],
this.split('').map(function(x,i){ return i%size ? [] : this.slice(i,i+size) }, this)
)
}
Demo:
> '123412341234123412'.chunk(4)
["1234", "1234", "1234", "1234", "12"]
Upvotes: 9