Click here to Skip to main content
Licence 
First Posted 14 Nov 2006
Views 19,762
Downloads 56
Bookmarked 22 times

JStringBuilder

By VectorX | 28 Feb 2007
Simulates the C# StringBuilder Class in Javascript.
2 votes, 15.4%
1

2

3
1 vote, 7.7%
4
10 votes, 76.9%
5
4.69/5 - 13 votes
2 removed
μ 4.15, σa 2.61 [?]

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

About the Author

VectorX



United States United States

Member


Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
Generaltags PinmemberSeishin#4:29 6 Jul '09  
GeneralNice article PinmemberOlivier Giulieri14:21 28 Aug '08  
GeneralArrays for string concantenation PinmemberRick @ Vertex12:32 25 Aug '07  
Generalwww.codevendor.com PinmemberKarlS8:56 21 Nov '06  
GeneralRe: www.codevendor.com PinmemberVectorX9:01 21 Nov '06  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    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 | Mobile
Web02 | 2.5.120210.1 | Last Updated 28 Feb 2007
Article Copyright 2006 by VectorX
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid