Piszemy funkcję myTrim, która działa tak jak w PHP, czyli pozwala nam wybrać trimowany znak. Do dzieła.
Ok, najpierw funkcja trimSpaces:
function trimSpaces(str){
let trimmedChar = " ";
let left = 0;
let right = str.length - 1;
while(str[left] === trimmedChar){
left++;
}
while(str[right] === trimmedChar){
if(str[right -1] !== trimmedChar)
break;
right--;
}
return str.substring(left, right);
}
let msg = " Hello World ";
console.log(trimSpaces(msg));
//Hello World
Substring działa w ten sposób, że bierze indeks pierwszego elementu, jaki ma zostać włączony oraz indeks pierwszego elementu, jaki ma zostać wyłączony.
A zatem potrzebujemy pierwszy lewy, który spacją nie jest oraz ostatni prawy, który spacją jeszcze jest – stąd taka a nie inna konstrukcja pętli.
Dodajemy opcję wybierania znaku oraz robimy polyfill:
String.prototype.myTrim = function(trimmedChar = " "){
let left = 0;
let right = this.length - 1;
while(this[left] === trimmedChar){
left++;
}
while(this[right] === trimmedChar){
if(this[right -1] !== trimmedChar)
break;
right--;
}
return this.substring(left, right);
}
console.log(" Hello World ".myTrim(" "));
console.log("!!Hello World!!".myTrim("!"));
Ok, jeszcze weźmy pod uwagę edge-cases. Oto one:
console.log(" ".myTrim(" "));
console.log("!!Hello World!!".myTrim("!!"));
W pierwszym przypadku left będzie większe niż right i ten substring nic nie da.
//(...)
if(left > right)
return "";
return this.substring(left, right);
}
console.log(" ".myTrim(" "));
//<empty string>
console.log("!!Hello World!!".myTrim("!!"));
//!!Hello World!
Ok, pierwszy problem rozwiązany. Teraz drugi:
String.prototype.myTrim = function(trimmedChar = " "){
if(trimmedChar.length < 1)
trimmedChar = " ";
if(trimmedChar.length > 1)
trimmedChar = trimmedChar[0];
let left = 0;
let right = this.length - 1;
while(this[left] === trimmedChar){
left++;
}
while(this[right] === trimmedChar){
if(this[right -1] !== trimmedChar)
break;
right--;
}
if(left > right)
return "";
return this.substring(left, right);
}
console.log(" ".myTrim(" "));
//<empty string>
console.log(" ".myTrim(" "));
//<empty string>
console.log("!!Hello World!!".myTrim("!!"));
//Hello World
Ok, działa jak widać.