Introduction
I wrote this code because I needed a comparable C# Stringbuilder
Class in JavaScript. Internet Explorer is very crappy when it comes to string concat. If you ever tried to loop through code with a=a+"string";
then you know what I am talking about. Other browsers seem to do fine. I am not sure what IE is doing in the background. IE seems to be optimised for arrays. So I built a wrapper in JavaScript that simulates the stringbuilder
class. I tried to include as many of the original stringbuilder
methods within size limits(keeping a low 1.1KB script size). I also built a test harness to see the actual savings in time. The test was to loop 10,000 times appending strings together. The string
object produced a result of: 2.34 seconds to build an render. The StringBuilder Class produced a result of: 0.187 seconds. WOW! what an improvement. But tests in FireFox show almost equal. This helped me to conclude that IE does not handle JavaScript string concat very well. If you push the test harness to 100,000 iterations, the string doesn't seem to finish. With AJAX in the main stream, more companies are rethinking client/server side processing. Why not utilize the clients processor with managing data organization? Hmm, well it seems to me everything should be balanced, kinda like eating food. If you keep a balanced diet you are very healthy. Coding is no different. Hopefully in the future app and web will be equal.
Documented Source Code
StringBuilder = function(stringToAdd)
{
var h = new Array();
if(stringToAdd){h[0] = stringToAdd;}
this.Append = Append;
this.AppendLine = AppendLine;
this.AppendFormat = AppendFormat;
this.ToString = ToString;
this.Clear = Clear;
this.Length = Length;
this.Replace = Replace;
this.Remove = Remove;
this.Insert = Insert;
this.GetType = GetType;
function Append(stringToAppend)
{
h[h.length] = stringToAppend;
}
function AppendLine(stringToAppend)
{
h[h.length] = stringToAppend;
h[h.length] = "\r\n";
}
function ToString()
{
if(!h){ return ""; }
if(h.length<2){ return (h[0])?h[0]:""; }
var a = h.join('');
h = new Array();
h[0] = a;
return a;
}
function Clear()
{
h = new Array();
}
function Length()
{
if(!h){return 0;}
if(h.length<2){ return (h[0])?h[0].length:0; }
var a = h.join('');
h = new Array();
h[0] = a;
return a.length;
}
function Replace(oldValue, newValue, caseSensitive)
{
var b = ReplaceThis(h.join(''), oldValue, newValue, caseSensitive);
h = new Array();
h[0] = b;
return this;
}
function Remove(startIndex, length)
{
var s = h.join('');
h = new Array();
if(startIndex<1){h[0]=s.substring(length, s.length);}
if(startIndex>s.length){h[0]=s;}
else
{
h[0]=s.substring(0, startIndex);
h[1]=s.substring(startIndex+length, s.length);
}
return this;
}
function Insert(index, value)
{
var s = h.join('');
h = new Array();
if(index<1){h[0]=value; h[1]=s;}
if(index>=s.length){h[0]=s; h[1]=value;}
else
{
h[0]=s.substring(0, index);
h[1]=value;
h[2]=s.substring(index, s.length);
}
return this;
}
function GetType()
{
return "StringBuilder";
}
function ReplaceThis(_WhatToCheck, _FindThis, _ReplaceWith, _CaseSense)
{
if(_WhatToCheck==undefined || _WhatToCheck==""){return "";}
var r=new RegExp(_FindThis,(_CaseSense==true)?'g':'gi');
return _WhatToCheck.replace(r, _ReplaceWith);
}
function AppendFormat(format, arg0)
{
for (var i = 1; i < arguments.length; i++)
{
format = ReplaceThis(format, "\\{" + (i-1) + "\\}",
arguments[i], true)
}
Append(format);
}
};
Compressed Source Code (1.1 KB)
StringBuilder=function(A){var h=new Array();if(A){h[0]=A;}this.Append=Append;
this.AppendLine=AppendLine;this.AppendFormat=AppendFormat;
this.ToString=ToString;this.Clear=Clear;this.Length=Length;
this.Replace=Replace;this.Remove=Remove;this.Insert=Insert;
this.GetType=GetType;function Append(s){h[h.length]=s;}
function AppendLine(s){h[h.length]=s;h[h.length]="\r\n";}function ToString()
{if(!h){return "";}if(h.length<2){return (h[0])?h[0]:"";}var a=h.join('');
h=new Array();h[0]=a;return a;}function Clear(){h=new Array();}
function Length(){if(!h){return 0;}if(h.length<2){return (h[0])?h[0].length:0;}
var a=h.join('');h=new Array();h[0]=a;return a.length;}function Replace(o,n,c)
{var b=ReplaceThis(h.join(''),o,n,c);h=new Array();h[0]=b;return this;}
function Remove(i,l){var s=h.join('');h=new Array();if(i<1){h[0]=s.substring
(l,s.length);}if(i>s.length){h[0]=s;}else{h[0]=s.substring(0,i);
h[1]=s.substring(i+l,s.length);}return this;}function Insert(i,v)
{var s=h.join('');h=new Array();if(i<1){h[0]=v;h[1]=s;}if(i>=s.length){h[0]=s;
h[1]=v;}else{h[0]=s.substring(0,i);h[1]=v;h[2]=s.substring(i,s.length);}
return this;}function GetType(){return "StringBuilder";}
function ReplaceThis(W,F,R,C){if(W==undefined||W==""){return "";}
var r=new RegExp(F,(C==true)?'g':'gi');return W.replace(r,R);}
function AppendFormat(F,A){for(var i=1;i<arguments.length;i++)
{F=ReplaceThis(F,"\\{" + (i-1) + "\\}",arguments[i],true)}Append(F);}};
Version
- Version 1.1: Added
AppendFormat
Function and ReplaceThis
Function
Date Released: Feb 27, 2007 - Version 1.0:
JStringBuilder
Class Released
Date Released: Nov 12, 2006