Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / web / HTML

JStringBuilder

4.69/5 (13 votes)
28 Feb 20071 min read 1   98  
Simulates the C# StringBuilder Class in Javascript.

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

JavaScript
/*
    ##################### DO NOT MODIFY THIS HEADER #####################
    #                                                                   #
    # Title: JStringBuilder Class                                       #
    # Description: Simulates the C# StringBuilder Class in Javascript.  #
    # Website: www.codevendor.com                                       #
    # Author: Adam Smith                                                #
    # Email: ibulwark@hotmail.com                                       #
    # Date: November 12, 2006                                           #
    #                                                                   #
    # ----------------------------------------------------------------- #
    #                                                                   #
    # 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                                       #
    #                                                                   #
    #####################################################################
*/

// Simulates the C# StringBuilder Class in Javascript.
// Parameter["stringToAdd"] - The string to add.
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;


    // Appends the string representation of a specified object to the end 
    // of this instance.
    // Parameter["stringToAppend"] - The string to append.
    function Append(stringToAppend)
    {
        h[h.length] = stringToAppend;
    }

    // Appends the string representation of a specified object to the end 
    // of this instance with a carriage return and line feed.
    // Parameter["stringToAppend"] - The string to append.
    function AppendLine(stringToAppend)
    {
        h[h.length] = stringToAppend;
        h[h.length] = "\r\n";
    }

    // Converts a StringBuilder to a String.
    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;
    }

    // Clears the StringBuilder
    function Clear()
    {
        h = new Array();
    }

    // Gets the StringBuilder Length
    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;
    }

    // Replaces all occurrences of a specified character or string 
    // in this instance with another specified character or string.
    // Parameter["oldValue"] - The string to replace.
    // Parameter["newValue"] - The string that replaces oldValue.
    // Parameter["caseSensitive"] - True or false for case replace.
    // Return Value - A reference to this instance with all instances of 
    // oldValue replaced by newValue.
    function Replace(oldValue, newValue, caseSensitive)
    {
    var b = ReplaceThis(h.join(''), oldValue, newValue, caseSensitive);
        h = new Array();
        h[0] = b;
        return this;
    }

    // Removes the specified range of characters from this instance.
    // Parameter["startIndex"] - The position where removal begins.
    // Parameter["length"] - The number of characters to remove.
    // Return Value - A reference to this instance after the excise 
    // operation has occurred.
    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;
    }

    // Inserts the string representation of a specified object into 
    // this instance at a specified character position.
    // Parameter["index"] - The position at which to insert.
    // Parameter["value"] - The string to insert.
    // Return Value - A reference to this instance after the insert 
    // operation has occurred.
    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;
    }

    // Gets the type
    function GetType()
    {
        return "StringBuilder";
    }

    //Replaces a string with a string
    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);
    }

    //Appends a formatted string
    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)

JavaScript
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

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here