Javascript String.split that'll return the remainder
In other languages I use String.splits' limit
argument usually means, "split this string this many times, and put any remainder as the last array index". In Javascript however anything past the limit
split is just discarded.
Example:
/* A function that splits a string `limit` times and adds the remainder as a final array index.
* > var a = 'convoluted.madeup.example';
* > a.split('.', 1);
* < ['convoluted']
* // What I expected:
* < ['convoluted', 'madeup.example']
*/
function split(str, separator, limit) {
str = str.split(separator);
if(str.length > limit) {
var ret = str.splice(0, limit);
ret.push(str.join(separator));
return ret;
}
return str;
}
Written by Björn Andersson
Related protips
3 Responses
splice changes the array in place, if it removes it'll return the items removed.
With the test cases I've had I've gotten out the results I want, so while I don't deny the possibility of a bug it's not in my current test cases.
Test cases being:
split('convoluted.madeup.example.with.more.stuff', '.', 1) => ["convoluted", "madeup.example.with.more.stuff"]
split("hello-do-nothing-with-me-except-an-array", '.', 1) => ["hello-do-nothing-with-me-except-an-array"]
split("first.second-but-also-the-remainder-even-if-more-mightve-been", '.', 3) =>
["first", "second-but-also-the-remainder-even-if-more-mightve-been"]
Haha, that's a very good catch. A really silly if
there. :)
here is another implementation:
function split2(str, separator, limit) {
if (limit==0) return [str];
var a = str.split(separator, limit);
if(a.length == limit) {
let s = a.join(separator) + separator;
a.push( str.substr(s.length) );
return a;
}else{
return [str];
}
}
this way you don't have to split the entire string (in case it is huge), also shouldn't the function always return an array?