Click here to Skip to main content
13,042,421 members (70,851 online)
Click here to Skip to main content
Add your own
alternative version

Stats

27.7K views
22 bookmarked
Posted 14 Nov 2006

JStringBuilder

, 28 Feb 2007
Rate this:
Please Sign up or sign in to vote.
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

/*
    ##################### 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)

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

Share

About the Author

M@dHatter
Software Developer (Senior) Codevendor
United States United States
Please visit my personal website http://www.codevendor.com for my latest codes and updates.

Raise Bid

You may also be interested in...

Comments and Discussions

 
Generaltags Pin
Seishin#6-Jul-09 3:29
memberSeishin#6-Jul-09 3:29 
GeneralNice article Pin
Olivier Giulieri28-Aug-08 13:21
memberOlivier Giulieri28-Aug-08 13:21 
GeneralArrays for string concantenation Pin
Rick @ Vertex25-Aug-07 11:32
memberRick @ Vertex25-Aug-07 11:32 
Generalwww.codevendor.com Pin
KarlS21-Nov-06 7:56
memberKarlS21-Nov-06 7:56 
GeneralRe: www.codevendor.com Pin
VectorX21-Nov-06 8:01
memberVectorX21-Nov-06 8:01 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.170713.1 | Last Updated 28 Feb 2007
Article Copyright 2006 by M@dHatter
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid