array länge
Paul
- javascript
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.
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
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
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
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
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:]
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.
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);
gruß,
wahsaga
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.
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
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
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.
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
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
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
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.
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
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
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
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 = 2Ich 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