Paul: array länge

Moin,
mit array.length kann man sich ausgeben lassen wie viele Elemente das array hat. Gibt es auch eine Möglichkeit herauszufinden, wie viele Zeichen in den array-Elementen stecken (ohne jedes Element einzeln abzufragen)?

Beispiel:
array[0] = "Baum";
array[1] = "Haus";
array.length = 2

Ich möchte aber array.xxx = 8 bekommen.

  1. Hi,

    mit array.length kann man sich ausgeben lassen wie viele Elemente das array hat. Gibt es auch eine Möglichkeit herauszufinden, wie viele Zeichen in den array-Elementen stecken (ohne jedes Element einzeln abzufragen)?

    nein, zumal ja nicht mal gesagt ist, dass auf die im Array gespeicherten Objekte die Fragestellung "Wie viele Zeichen hat es?" irgend einen Sinn ergibt.

    Beispiel:

    array[0] = 12;
    array[1] = new Object();
    array[2] = new SvgGraph();

    Ich möchte aber array.xxx = 8 bekommen.

    Erweitere den Prototypen von Arrays um eine getContentLength()-Methode (o.ä.), die dies ermittelt.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Erweitere den Prototypen von Arrays um eine getContentLength()-Methode (o.ä.), die dies ermittelt.

      In etwa so denkbar:

      Array.prototype.getLength = function(i) {  
        return ((typeof this[i] == 'string') ? this[i].length : false);  
      }  
        
      var myArr = new Array('foo', 'bar', 42);  
      alert(myArr.getLength(2) ? myArr.getLength(2) : 'Element ist kein String');
      

      Ausbaufähig, denke ich :)

      Siechfred

      --
      Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
      1. gruss Siechfred, hi Cheatah, hallo Paul,

        Erweitere den Prototypen von Arrays um eine getContentLength()-
        Methode (o.ä.), die dies ermittelt.

        Cheatah

        ... code ...
        Ausbaufähig, denke ich :)

        Siechfred

        kurz und schmerzlos ueber [Array.filter] und [Array.join]:

        ~~~javascript Array.prototype.getStringTypesLength = function () {

        return (this.filter(function (elm) {return ((typeof elm == "string") || (elm instanceof String))}).join("").length);
          };
        /*

        test it:

        Array.prototype.getStringTypesLength = function () {return(this.filter(function(elm){return((typeof elm=="string")||(elm instanceof String))}).join("").length);};

        alert(["hallo", "welt", {}, [], , "", 1, (new String("Baum")), "Haus", Number.NaN, String(42)].getStringTypesLength()); // 19;
        */
        //javascript:Array.prototype.getStringTypesLength = function () {return(this.filter(function(elm){return((typeof elm=="string")||(elm instanceof String))}).join("").length);};alert(["hallo", "welt", {}, [], , "", 1, (new String("Baum")), "Haus", Number.NaN, String(42)].getStringTypesLength());

          
          
          
        oder aber \*old school\*-maessig:  
          
          
          ~~~javascript
        Array.prototype.getStringTypesLength = function () {  
          
            var i, obj, arr = [];  
            for (i = 0; i<this.length; ++i) {  
          
              obj = this[i];  
              if ((typeof obj == "string") || (obj instanceof String)) {  
          
                arr.push(obj);  
              }  
            }  
            return arr.join("").length;  
          };  
        /*  
          test it:  
          
          Array.prototype.getStringTypesLength = function () {var i,obj,arr=[];for(i=0;i<this.length;++i){obj=this[i];if((typeof obj=="string")||(obj instanceof String)){arr.push(obj);}}return arr.join("").length;};  
          
          alert(["hallo", "welt", {}, [], , "", 1, (new String("Baum")), "Haus", Number.NaN, String(42)].getStringTypesLength()); // 19;  
        */  
        //javascript:Array.prototype.getStringTypesLength = function () {var i,obj,arr=[];for(i=0;i<this.length;++i){obj=this[i];if((typeof obj=="string")||(obj instanceof String)){arr.push(obj);}}return arr.join("").length;};alert(["hallo", "welt", {}, [], , "", 1, (new String("Baum")), "Haus", Number.NaN, String(42)].getStringTypesLength());
        

        so long - peterS. - pseliger@gmx.net

        --
        »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
        Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
        ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
        1. hi,

          oder aber *old school*-maessig:

          Ist es an dieser Stelle irgendwie performanter, die Strings erst in ein Array zu pushen, dieses dann zu joinen, und die length des Ergebnisses zu ermitteln - anstatt einfach die length der einzelnen Elemente vom Typ String in der Schleife aufzusummieren?

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. gruss wahsaga,

            Ist es an dieser Stelle irgendwie performanter, die Strings erst in ein Array zu pushen,
            dieses dann zu joinen, und die length des Ergebnisses zu ermitteln - anstatt einfach die
            length der einzelnen Elemente vom Typ String in der Schleife aufzusummieren?

            darueber hab' ich noch gar nicht richtig nachgedacht - [Array.join] ist aber sauschnell.
            zumindest was die konkatenation von string-werten angeht, ist es dem "+" operator haushoch
            ueberlegen.

            bei einer grossen anzahl von eintraegen 1000? ... 10.000 ist es aber doch nicht ganz so klug,
            alle string-typen als referenz in einem zweiten array zwischenzuspeichern - dieser vorgang
            belegt ja adressraum - das direkte addieren der jeweilige laenge eines passenden eintrags auf
            genau eine adresse ist da in der tat viel billiger.

            ich hab' dazu mal schnell einen test geschrieben - das ergebnis fuer den einsatz beider zuvor
            geposteten methoden ist niederschmetternd:

            methode a) - arbeitet mit einer for-schleife und blaesst intern ein array auf.
            methode b) - arbeitet mit dem iterator [Array.filter] und nutzt intern ebenfalls ein array.

            methode c) - arbeitet mit einer for-schleife und addiert auf eine adresse.
            methode d) - arbeitet mit dem iterator [Array.forEach] und addiert ebenfalls.

            c)
              ~~~javascript Array.prototype.getStringTypesLength = function () {

            var i, obj, length = 0;
                for (i = 0; i<this.length; ++i) {

            obj = this[i];
                  if ((typeof obj == "string") || (obj instanceof String)) {

            length += obj.length;
                  }
                }
                return length;
              };
            //javascript:Array.prototype.getStringTypesLength = function () {var i,obj,length=0;for(i=0;i<this.length;++i){obj=this[i];if((typeof obj=="string")||(obj instanceof String)){length+=obj.length;}}return length;};alert(["hallo", "welt", {}, [], , "", 1, (new String("Baum")), "Haus", Number.NaN, String(42)].getStringTypesLength());

              
            d)  
              ~~~javascript
            Array.prototype.getStringTypesLength = function () {  
              
                var length = 0;  
              
                this.forEach(function (elm) {  
                  if ((typeof elm == "string") || (elm instanceof String)) {  
                    length += obj.length;  
                  }  
                });  
              
                return length;  
              };  
            //javascript:Array.prototype.getStringTypesLength = function () {var length=0;this.forEach(function(elm){if((typeof elm=="string")||(elm instanceof String)){length+=elm.length;}});return length;};alert(["hallo", "welt", {}, [], , "", 1, (new String("Baum")), "Haus", Number.NaN, String(42)].getStringTypesLength());
            

            testcase:

            ~~~javascript (function () {

            var str = "Sed turpis. In porta est a enim. Nam velit. Nullam nec tellus. Mauris lacinia quam eget tellus. Pellentesque fringilla. Maecenas in neque vitae leo fermentum iaculis. Sed dolor erat, pretium vitae, dictum eget, luctus vitae, mauris. Quisque vehicula velit quis diam. Morbi posuere scelerisque lacus. Nunc metus. Vestibulum lorem nisl, malesuada dignissim, pretium sed, auctor a, sapien. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla placerat elit et dolor. Morbi est. Aenean id est. Proin eu massa. Nullam hendrerit. Praesent blandit convallis dui.";
                var loops = 10000;
                var arr = []; for (var i=0; i<loops; ++i) {arr.push(str);}
                var time = new Date();
                var length = arr.getStringTypesLength();
                time = (new Date()) - time;

            alert("zeit fuer " + loops + " eintraege mit je " + str.length + " zeichen : " + time + " msec");
              })();
            //(function () {var str = "Sed turpis. In porta est a enim. Nam velit. Nullam nec tellus. Mauris lacinia quam eget tellus. Pellentesque fringilla. Maecenas in neque vitae leo fermentum iaculis. Sed dolor erat, pretium vitae, dictum eget, luctus vitae, mauris. Quisque vehicula velit quis diam. Morbi posuere scelerisque lacus. Nunc metus. Vestibulum lorem nisl, malesuada dignissim, pretium sed, auctor a, sapien. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla placerat elit et dolor. Morbi est. Aenean id est. Proin eu massa. Nullam hendrerit. Praesent blandit convallis dui.";var loops = 10000;var arr = []; for (var i=0; i<loops; ++i) {arr.push(str);}var time = new Date();var length = arr.getStringTypesLength();time = (new Date()) - time;alert("zeit fuer " + loops + " eintraege mit je " + str.length + " zeichen : " + time + " msec");})();

              
              
            ergebnisse:  
              
            a) + 10.000 loops: 46.389 msec  
            b) + 10.000 loops: 46.249 msec  
            c) + 10.000 loops:    125 msec  
            d) + 10.000 loops:     93 msec  
              
              
            vielen dank wahsaga fuer die qualitaetssicherung - empfohlen wird der einsatz von c) und d).  
              
              
              
            so long - peterS. - pseliger@gmx.net  
              
              
            
            -- 
            »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.  
            Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - [Douglas Crockford](http://javascript.crockford.com/)  
              
            ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
            
            1. Aber mal 'ne andere Frage.

              if ((typeof obj == "string") || (obj instanceof String)) {

              ist diese doppelte Prüfung wirklich nötig?

              Ich kann mir irgendwie keinen Fall vorstellen, wo typeof 'string' zurückgibt aber die Variabel kein String ist.

              Struppi.

              --
              Javascript ist toll (Perl auch!)
              1. hi,

                if ((typeof obj == "string") || (obj instanceof String)) {

                ist diese doppelte Prüfung wirklich nötig?

                Ich kann mir irgendwie keinen Fall vorstellen, wo typeof 'string' zurückgibt aber die Variabel kein String ist.

                Nein, aber andersherum:

                var x = new String("blubb");
                alert(typeof x);

                • ergibt zumindest im IE 6 (andere gerade nicht zur Hand) "object".

                gruß,
                wahsaga

                --
                /voodoo.css:
                #GeorgeWBush { position:absolute; bottom:-6ft; }
                1. Nein, aber andersherum:

                  var x = new String("blubb");

                  Wer macht denn sowas? ;-)
                  Na gut, ich verstehe.

                  alert(typeof x);

                  • ergibt zumindest im IE 6 (andere gerade nicht zur Hand) "object".

                  auch im IE 7.

                  Struppi.

                  --
                  Javascript ist toll (Perl auch!)
                  1. Hi,

                    var x = new String("blubb");
                    Wer macht denn sowas? ;-)

                    die richtige Reaktion, aber in der falschen Situation. Korrekt angewendet wird diese Frage auf die Äußerung: "Herr Doktor, ich habe einen Knoten in der Brust!"

                    Cheatah, SCNR

                    --
                    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                    X-Will-Answer-Email: No
                    X-Please-Search-Archive-First: Absolutely Yes
                  2. Hallo Struppi.

                    Nein, aber andersherum:

                    var x = new String("blubb");

                    Wer macht denn sowas? ;-)

                    Hätte durchaus praktische Relevanz.

                    Einen schönen Dienstag noch.

                    Gruß, Mathias

                    --
                    ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
                    debian/rules
                    1. Wer macht denn sowas? ;-)

                      Hätte durchaus praktische Relevanz.

                      Das ist neu für mich, sehr interessant. Ich vermute das ist in alen Browsern so?

                      Struppi.

                      --
                      Javascript ist toll (Perl auch!)
                      1. Hallo Struppi.

                        Wer macht denn sowas? ;-)

                        Hätte durchaus praktische Relevanz.

                        Das ist neu für mich, sehr interessant. Ich vermute das ist in alen Browsern so?

                        Mehr als ein „vermutlich“ bleibt mir hier nicht zu sagen, da von den großen lediglich zwei (Gecko, Webkit/KHTML) quelloffen sind, so dass man die tatsächliche Implementation überprüfen könnte.

                        Einen schönen Dienstag noch.

                        Gruß, Mathias

                        --
                        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
                        debian/rules
                      2. Hallo,

                        Ich vermute das ist in alen Browsern so?

                        Jedenfalls ist das ein notwendiges Erfordernis an jede ECMAScript-Implementation:
                        »When you reference a property or method of a string value, the ECMAScript engine must implicitly create a new string object with the same value as your string, before running the method. This object is only used for that one request, and will be recreated next time you attempt to use a method of the string value.«

                        Mathias

              2. gruss Struppi,

                if ((typeof obj == "string") || (obj instanceof String)) {

                ist diese doppelte Prüfung wirklich nötig?

                ja, definitiv, wobei die ODER-logik ja nur dann nachfasst, wenn
                der erste vergleich fehlschlaegt, denn auch ...

                Ich kann mir irgendwie keinen Fall vorstellen, wo typeof 'string'
                zurückgibt aber die Variabel kein String ist.

                ... ein [String]-objekt ist immer vom typ "object" aber in jedem
                fall eine instanz von [[String]]:

                alert(typeof "struppi");               // "string" - ok, der hier ist klar.  
                alert(typeof String("struppi"));       // "string" - ok (String als Methode fuer z.b. explizites typecasting).  
                alert(typeof (new String("struppi"))); // "object" - au backe - nicht ok - der wuerde durchrutschen.  
                  
                alert(typeof String(new String("struppi"))); // "string" - zur bestaetigung der zuvor getroffenen aussagen.
                

                da JavaScript angenehm lose typisiert ist, traegt man beim schreiben
                einigermassen *wasserfesten* codes immer selbst die verantwortung fuer
                den (nicht)einsatz von type-detection.

                so long - peterS. - pseliger@gmx.net

                --
                »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
                Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
                ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
                1. ist diese doppelte Prüfung wirklich nötig?

                  ja, definitiv, wobei die ODER-logik ja nur dann nachfasst, wenn
                  der erste vergleich fehlschlaegt, denn auch ...

                  Du hast es gemerkt ;-) - das oder hab ich aus irgendeinem Grund nicht in wahrgenommen.

                  Ich kann mir irgendwie keinen Fall vorstellen, wo typeof 'string'
                  zurückgibt aber die Variabel kein String ist.

                  ... ein [String]-objekt ist immer vom typ "object" aber in jedem
                  fall eine instanz von [[String]]:

                  Jaja, das String Objekt - ich hab das zuletzt benutzt, als ich etwas für den IE 3 programmieren musste, da u.a. dessen Typeumwandlung buggy war.

                  Aber, jetzt ist es klar.

                  Struppi.

                  --
                  Javascript ist toll (Perl auch!)
      2. Moin!

        In etwa so denkbar:

        Dein Code zeigt zwar exemplarisch die prototypische Erweiterung des Array-Elements, inhaltlich ist er allerdings sinnlos.

          
        
        > var myArr = new Array('foo', 'bar', 42);  
        > alert(myArr.getLength(2) ? myArr.getLength(2) : 'Element ist kein String');  
        
        // Das geht auch einfacher:  
        alert(typeof myArr[2]=="string"?myArr[2].length:'Element ist kein String'); // liefert direkt die Länge eines einzelnen Strings im Array.  
        
        

        Ausbaufähig, denke ich :)

        Sicherlich. Die OP-Forderung war, die Gesamtlänge aller Elemente des Arrays zu ermitteln. Die Iteration über alle Elemente wär' ja jetzt nicht so schwierig gewesen, oder? :)

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
      3. Hallo,

          
        
        > var myArr = new Array('foo', 'bar', 42);  
        
        

        ..., dass so ein Typmix statthaft ist, geht mir quer runter. Wahrscheinlich darf man die Typen nicht als string und number, sondern nur als objects sehen?

        Gruß plan_B

        --
             *®*´¯`·.¸¸.·
        1. Hi,

          var myArr = new Array('foo', 'bar', 42);
          ..., dass so ein Typmix statthaft ist, geht mir quer runter. Wahrscheinlich darf man die Typen nicht als string und number, sondern nur als objects sehen?

          betrachte

          var myArr = new Array('foo', 'bar', 42, {'foo':'bar'}, [1, 2, 3], function() { return false; }, true, null, undefined);

          und frag noch mal ;-) Es sind einige Objekttypen drin, aber nicht jeder der Werte ist ein Objekt.

          Cheatah

          --
          X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
  2. gudn tach!

    hat. Gibt es auch eine Möglichkeit herauszufinden, wie viele Zeichen in den array-Elementen stecken (ohne jedes Element einzeln abzufragen)?

    Beispiel:
    array[0] = "Baum";
    array[1] = "Haus";
    array.length = 2

    Ich möchte aber array.xxx = 8 bekommen.

    afaik gibt es sowas nicht. selbst ein
    join mit einer leeren zeichenkette und anschliessendes laenge-messen waere ja praktisch auch wieder nur ein einzelnes auszaehlen.

    du kannst dir halt hoechstens, so wie Cheatah es auch schon vorschlug, selbst eine array-methode basteln.

    prost
    seth