Ein Array kann angelegt werden mit
var arr = new Array();
oder kürzer (und meist günstiger) mit
var arr = [];
.
Beispiel:
var a = [ ]; a[2] = [ ]; a[2][1] ='a[2][1]-Wert'
; a[4] ='a[4]-Wert'
; // Achtung: // nicht definierte Array-Werte sindundefined
// und a.length ist jetzt 5 // und a[2].length ist jetzt 2
Für Arrays gibt es eingebaute Methoden:
concat() join() pop() push() reverse() shift() slice() sort() splice() toLocaleString() toString() unshift() valueOf()
Eigenschaft | |
---|---|
.length | liefert die Länge des Array (=Anzahl der Elemente) |
Methoden die den Array verändern | |
.pop() | liefert letztes Array-Element und löscht es |
.push() | .push(Element) hängt ein Element am Ende des Array-Elemente an und gibt die Länge zurück
|
.reverse() | Dreht die Reihenfolge eines Arrays um |
.shift() | liefert das erste Element eines Arrays und entfernt es |
.sort() | .sort([vergleichsfunktion]) sortiert den Array
|
.splice() | .splice(position, anzahlLöschen, [element1][, ..., elementN]) fügt Elemente einem Array hinzu und/oder löscht welche |
.unshift() | .unshift(element1[, ..., elementN]) fügt ein oder mehrere Elemente am Anfang das Arrays hinzu und gibt die Länge zurück
|
Zugriffsmethoden (Array bleibt ungeändert) | |
.concat() | Gibt einen neuen Array zurück der aus diesem Array und angefügten Arrays oder Werten besteht |
.join() | Verbindet die Array-Elemente zu einem String |
.slice() | Extrahiert einen Ausschnitt aus einem Array |
.toString() | Gibt einen String aller Arrayelemente zurück |
.indexOf | (JS1.6) Gibt die Position des ersten Vorkommens eines Elements zurück oder -1 falls keins gefunden wurde |
.lastIndexOf | (JS1.6) Gibt die Position des letzten Vorkommens eines Elements zurück oder -1 falls keins gefunden wurde |
Schrittmethoden, Iteratorenfilter (JS1.6) für einen neuen Array Rückgabewert true | |
.forEach | (JS1.6) Calls a function for each element in the array. |
.every | (JS1.6) Gibt true zurück, wenn jedes Element die angegebene Prüffunktion besteht |
.map | (JS1.6) Erstellt einen neuen Array aus der Anwendung der Funktion auf jedes Element |
.some | (JS1.6) Gibt true zurück, wenn mindestens ein Element die angegebene Prüffunktion besteht |
.reduce | (JS1.8) ... |
.reduceRight | (JS1.8)... |
ECMAScript-Objekte und ECMAScript-Arrays unterscheiden sich.
Arrays haben automatisch "length-property" (normale Objekte nicht)
aber keine Methoden- und Properties-Ergänzungen.
Bei einem Array kann der Index ["..."]
ein String sein oder als "Data" manipuliert werden.
Bei einem Objekt kann der "."
nicht manipuliert werden.
Ein Array/Objekt kann durch folgende Methoden erzeugt werden:
// Array: var arr = [ ]; // oder var arr = new Array(); // oder var arr = new Array([size]); // oder var arr = new Array([element0[, element1[, ...[, elementN]]]]); // Object: var obj = { }; // oder var obj = new Object(); // oder ...
1. Vergleich: Array und Objekt anlegen: | |
---|---|
var arr = [ "Müller", "Giessen", "Schulze", "Berlin", "Weber", "Frankfurt" ]; var obj = { name0:"Müller", ort0:"Giessen", name1:"Schulze", ort1:"Berlin", name2:"Weber", ort2:"Frankfurt" }; var s = ""; s += "Array-Zugriffe:"; s += "<br />arr[0]=" + arr[0]; s += "<br />arr[5]=" + arr[5]; arr.shift(1); s += "<br />Nach arr.shift(1) ist"; s += "<br />arr[0]=" + arr[0]; s += "<br />arr[5]=" + arr[5]; s += "<br /><br />"; s += "Objekt-Zugriffe:"; s += "<br />obj.name0=" + obj.name0; s += "<br />obj.ort2=" + obj.ort2; document.write(s); |
Anzeige: |
2. Vergleich: Array und Objekt anlegen: | |
<script type="text/javascript">/*<![CDATA[*/ var arr = [ ["Müller", "Giessen" ], ["Schulze", "Berlin" ], ["Weber", "Frankfurt"] ]; var obj = { row0:{nam0:"Müller", ort0:"Giessen" }, row1:{nam1:"Schulze", ort1:"Berlin" }, row2:{nam1:"Weber", ort1:"Frankfurt"} }; var s = "arr[2][1]=" + arr[2][1]; s += "<br />"; s += "obj.row2.ort1="+obj.row2.ort1; document.write(s); /*]]>*/</script> |
Ein typeof my_arr lieferte keine zuverlässiges Ergebnis ( historische Gründe ). Der folgende Code kann auch bei solchen Browsern genutzt werden.
if(!Array.isArray) { Array.isArray = function (vArg) { return Object.prototype.toString.call(vArg) === "[object Array]"; }; }
1-dim Arrays | ||
---|---|---|
1-dim Arrays |
var i, s = ""; var arr = ["0" ,1, "2"]; //var arr = new Array("0" ,1, "2"); arr[4] = 4; s += "typeof(arr)="+typeof(arr)+"<br>"; for(i=0; i < arr.length; ++i) { s += arr[i]; s += ", typeof(arr[" + i + "])="; s += typeof(arr[i]) + "<br>"; } document.write(s); | Anzeige von arr: |
2-dim Arrays | ||
2-dim Arrays |
var arr = new Array(3); for (var i=0; i < arr.length; ++i){ arr[i] = new Array(4); for (var j=0; j < arr[i].length; ++j) { arr[i][j] = (i+4)*(j+1); } } var sdez = "", shex = ""; // Ausgabe: for (var i=0; i < arr.length; ++i){ for (var j=0; j < arr[i].length; ++j) { sdez += arr[i][j] +","; shex += arr[i][j].toString(16)+","; } sdez += "<br>"; shex += "<br>"; } document.write("<br>dez:<br>"+sdez); document.write("<br>hex:<br>"+shex); | Anzeige des 3x4-arr: |
assoziative Arrays | ||
assoziative Arrays |
var arr = []; arr[0] = []; arr[0]["name"] = "Mueller"; arr[0]["ort"] = "Giessen"; arr[1] = []; arr[1]["name"] = "Schulze"; arr[1]["ort"] = "Berlin"; arr[3] = []; arr[3]["name"] = "Weber"; arr[3]["ort"] = "Frankfurt"; var i, idx, s =""; for (i=0; i < arr.length; ++i) { if(!arr[i]) continue; s += "<br>arr[" + i + "]=|"; for (idx in arr[i]) { s += arr[i][idx] + "|"; } } document.write(s); | Zeichenkette als Index: arr[1].name entspricht Ausgabe: arr[1]["name"] |
Array. prototype |
Implizite Deklaration werden oft als Prototyp bezeichnet. function array_idx_max() { var i, idx=-1, max = this[0]; for (i = 1; i < this.length; i++) { if (max < this[i]) { max = this[i]; idx = i; } } return idx; } Array.prototype.idx_max = array_idx_max; var arr = [1, 2, 3, 4, 2, 1]; var s1 = "Ausgabe s1 ohne User-<br>" s1 += "toString()-prototype:<br>"; s1 += arr.toString()+"<br>"; s1 += "max="+arr[arr.idx_max()]; document.write(s1+"<br><br>"); function array_to_string() { var i, s = ""; for (i = 0; i < this.length; i++) { s += "["+i+"]="+this[i]+"<br>"; } return s; } Array.prototype.toString = array_to_string; var s2 = "Ausgabe s2 mit <br>" s2 += "toString()-prototype:<br>"; s2 += arr.toString(); document.write(s2); | Anzeige: |
Array sortieren | ||
---|---|---|
Array sortieren |
function vergleich(a,b) { return (a-b); } var aa = [66, 7, 11]; var x = aa.pop(); // hole 11 aa.push(x); // 11 wieder drauf aa.push(13); // 13 drauf aa.push(2); // 2 drauf aa.shift(); // 66 vorn raus aa.unshift(77); // 77 vorn rein var s = " vor dem Sortieren:<br>"; s += aa; s += "<br>lexikalisch sortiert:<br>"; s += aa.sort(); s += "<br>numerisch sortiert:<br>"; s += aa.sort(vergleich); document.write(s); | Anzeige |
.splice()
|
var s, arr = []; arr[0] = "e0"; arr[1] = "e1"; arr[2] = "e2"; arr[3] = "e3"; arr[5] = "e5"; s = arr.toString()+ "<br />"; arr.splice(3,2,"E3"); s += arr.toString(); document.write(s);
Hinweis:
Mit Hilfe von | Anzeige: |
.join()
|
var arr = ["11", "12", "13", 14]; var str = arr.join("|"); var s = "typeof str =" + typeof str; s += "<br />str = " + str; document.write(s) | Anzeige: |
.split() .join() .slice() |
var str = "Carl G Jung (Psych)", sep =" "; var arr = str.split(sep); var s = arr.slice(0,-1).join("|")+"<br />"; for (var i=0; i < arr.length; ++i) { s += "arr["+i+"]="+arr[i]+"<br />"; } document.write(s);
Hinweis:
|
Teilstrings von str: |
.concat()
|
var s1 = "Hal"; var s2 = "lo "; var s3 = s1.concat(s2); // s3 = s1 + s2; var a1 = [0,1,2]; var a2 = ["Welt",5]; var arr = a1.concat(s3, a2); document.write(arr); | Anzeige: |
.reverse()
|
var a1 = [0, 1, 222, 333, 444, 5]; // lösche [2],[3],[4] u.füge ein 2,3,4 ein: a1.splice(2,3, 2,3,4); a1.shift(); // löscht a1[0] // kopiere ohne letztes Element: var a2 = a1.slice(0,-1); var a3 = a2.reverse(); var s = "a1.length="+a1.length; s += "<br>"; s += "a2.length="+a2.length; s += "<br><br>"; s += "a3=<br>" +a3; document.write(s); | Anzeige: |
Diese Funktionen können die Methoden, die zu einem Array gehören,
erweitern (Array.prototype
).
Wie kann ppush()
implementiert werden?
if (!Array.prototype.push) { Array.prototype.push=function() { for (var i=0; i<arguments.length; i++) this[this.length]=arguments[i]; return this.length; // Verhalten von JS > 1.2 }; }
Wie kann pop()
implementiert werden?
if (!Array.prototype.pop) { Array.prototype.pop=function() { return this[this.length--]; }; }
Wie kann shift()
implementiert werden?
if (!Array.prototype.shift) { Array.prototype.shift=function(){ // schnell implementiert, aber nicht schnell this.reverse(); var rv=this.pop(); this.reverse(); return rv; }; }
Wie kann unshift
implementiert werden?
if (!Array.prototype.unshift) { Array.prototype.unshift=function() { // schnell implementiert, aber nicht schnell this.reverse(); for (var i=arguments.length-1; i>=0; i--) this[this.length]=arguments[i]; this.reverse(); return this.length; }; }
Wie kann splice
implementiert werden?
if (!Array.prototype.splice) { Array.prototype.splice=function(start,count) { var removed=new Array(); var tail=new Array(); var i; if (start<0) start += this.length; for (i=0; i<count; i++) removed.push(this[start+i]); for (i=start + count; i < this.length; i++) tail.push(this[i]); this.length = start; for (i=2; i<arguments.length; i++) this[this.length]=arguments[i]; for (i=0; i<tail.length; i++) this.push(tail[i]); return removed; }; }
Array.prototype.indexOf(el) | ||
---|---|---|
.indexOf |
Gibt den Index des gefundenen Array-Elementes zurück, sonst -1 if(!Array.indexOf) { Array.prototype.indexOf = function(el,start) { for(var i = (start || 0); i < this.length; i++) { if(el == this[i]) return i; } return -1; } } var aa=['0',1,'2',3]; document.write("aa.indexOf('2')="+aa.indexOf('2')); | Anzeige |
Array.prototype.forEach(function [,dstObj]) | ||
.map |
if (!Array.prototype.map) { // IE braucht eine Sondereinladung: Array.prototype.map = function(fn, thisObj) { thisObj = thisObj || window; var r = []; for (var i = 0, j=len = this.length; i < j; ++i) { r.push(fn.call(thisObj, this[i], i, this)); } return r; }; } function build_string(element, index, array) { return "[" + index + "]=" + element; } var aa = [1, 4, 9, 25]; var a1 = aa.map(function(x, i) { return i; }); var a2 = aa.map(function(x, i) { return x; }); var a3 = aa.map(function(x, i, o) { return o[i]; }); var a4 = aa.map(build_string); var a5 = aa.map(Math.sqrt); var s = "<br />a1: " + a1 + " = Array-Index" + "<br />a2: " + a2 + " = Element-Werte" + "<br />a3: " + a3 + " = Element-Werte" + "<br />a4: " + a4 + "<br />a5: " + a5 + " = sqrt-Beispiel"; document.write(s); | Anzeige |
.forEach |
if (!Array.prototype.forEach) { Array.prototype.forEach = function(fn, thisObj) { thisObj = thisObj || window; for (var i = 0, j = this.length; i < j; ++i) { fn.call(thisObj, this[i], i, this); } }; } var dst = { arr: [], empty: function() { this.arr = []; }, sav: function(s) { this.arr.push(s); }, sav1: function(s) { this.sav("|" + s); }, sav2: function(s) { this.sav("<" + s + ">"); }, toString: function() { return this.arr.join(""); } }; // schreibe in arr des dst-Objekt [1, 2, 3].forEach(dst.sav1, dst); [4, 5, 6].forEach(dst.sav1, dst); var s16 = "<br />" + dst.toString(); // lösche arr des dst-Objekt dst.empty(); // schreibe in arr des dst-Objekt [7, 8, 9].forEach(dst.sav2, dst); var s789 = "<br />" + dst.toString(); var s0 = "<br />dst.arr[0]=" + dst.arr[0]; document.write(s16 + s789 + s0); | Anzeige |
Gegeben sind mehrere Arrays, wie z.B. ["A","B"],['a','b'],[1,2]. Alle Elemente sollen nun mit merge([["A","B"],['a','b'],[1,2]]) in einen Arrays "gemerged" werden:
function merge(arrs) { var n = arrs.length,k,i = -1,m = 0,a,r; while (++i < n) {m += arrs[i].length;} r = new Array(m); while (--n >= 0) { a = arrs[n]; k = a.length; while (--k >= 0) { r[--m] = a[k]; } } return r; }
Mit der eingebauten Array-Funktion .concat
function merge(arrs) { var n = arrs.length, r = []; for( i=0; i < n; i += 1) { r = r.concat(arrs[i]); } return r; }
Mit einem Array wird im folgenden ein Stack mit dem Konstruktor
stack()
und den Member-Funktionen push(str), pop()
und show(obj)
aufgebaut.
Beispiel | Anzeige |
---|---|
function stack() { this.stack_arr = []; this.stack_arr[0] = 1; this.push = push; this.pop = pop; this.show = show; stack = stack.length = this; } function push(str) { var idx = this.stack_arr[0]; this.stack_arr[idx] = str; this.stack_arr[0] = ++idx; } function pop() { var idx = this.stack_arr[0]; var str = this.stack_arr[--idx]; if(idx < 1) alert("pop()-Error"); this.stack_arr[0] = idx; return str; } function show(obj) { document.write(obj.stack_arr); } //////////////////////////////////// function test() { var obj = new stack(), sa, sb; obj.push("4"); obj.push([1, "Hallo", "Welt"]); sb = obj.pop(); sa = obj.pop(); obj.push(sb); obj.push(sa); obj.show(obj); } test(); |
Die Funktion stack() initialisiert den Stack als einen Array this.stack_arr Der "Top of Stack Pointer" ist der aktuelle Array-Index, der in this.stack_arr[0] gespeichert wird. Zum Stack gehören die Member-Funktionen: push(), pop(), show(). Es wird kein Überlauf kontrolliert. Anzeige durch den test()-Aufruf: |
Ein Beispiel zeigt, wie Matrizen-Operationen (hier lediglich die Addition add)
mit dem Konstruktor Matrix(args)
.
Die Eingabe args ist ein String,
der mit dem Seperator
";" in Teilstrings gesplittet wird.
Jeder Teilstring wird
mit dem Seperator "," in die einzelnen Elemente zerlegt.
Ist das Element eine parseFloat()
-Zahl,
so wird diese als Zahl im Array
hinterlegt (sonst als String).
Die Member-Funktionen von Matrix()
sind toString(), getArray(), add(matrix)
programmiert werden können.
Abhängig von dem Element-Typ führt add(matrix)
eine Zahlenmultiplikation oder eine STringverkettung durch.
Das Beispiel zeigt, wie Matrizen-Operationen
mit dem Konstruktor Matrix(args)
durchgeführt werden können.
Die Konstruktor-Eingabe args ist ein String,
der mit dem Seperator ";" in Teilstrings gesplittet wird.
Jeder Teilstring wird mit dem Seperator "," in die einzelnen Elemente zerlegt.
Ist das Element eine parseFloat()
-Zahl, so wird diese als Zahl im Array
hinterlegt (sonst als String).
Die Member-Funktionen von Matrix()
sind toString(), getArray(), add(matrix)
.
Beispiel | Anzeige |
---|---|
function Matrix(args) { this.arr = []; var sj_sep=",", si_sep=";"; var i,j,nan,s, sj, si = args.split(si_sep); for(i=0; i < si.length; ++i) { sj = si[i].split(sj_sep); this.arr[i] = []; for(j=0; j < sj.length; ++j) { nan = parseFloat(sj[j]); if(isNaN(nan)) { this.arr[i][j] = sj[j]; } else { this.arr[i][j] = nan; } } } } //----------------------------------------------- Matrix.prototype.toString = function toString() { var i,j,s = ".toString():"; for(i=0; i < this.arr.length; ++i) { s += "<br>"; for(j=0; j < this.arr[i].length; ++j) { s += typeof(this.arr[i][j]); s += "(["+i+"]["+j+"])="; s += this.arr[i][j]+"<br>"; } } return s; } //----------------------------------------------- Matrix.prototype.getArray = function getArray() { return this.arr; } //----------------------------------------------- Matrix.prototype.add = function add(matrix) { var i,j, mat = matrix.getArray(); var s="", si_sep=";", sj_sep=","; if(this.arr.length != mat.length) return null; for(i=0; i < this.arr.length; ++i) { if(this.arr[i].length != mat[i].length) return null; if(i>0) s += si_sep; for( j=0; j < this.arr[i].length; ++j) { if(j>0) s += sj_sep; s += this.arr[i][j] + mat[i][j]; } } return new Matrix(s); } //----------------------------------------------- var mat1 = new Matrix("0,1; 2, 3"); var mat2 = new Matrix("1,0; -1,-2"); var mat3 = mat1.add(mat2); var s1 = "<br>mat1" + mat1; var s2 = "<br>mat2" + mat2; var s3 = "<br>mat3" + mat3; document.write(s1+s2+s3); | Anzeige: |
Wenn eine XHTML-Table im Source-Text vorliegt, so
kann dieser XHTML-Source-Text so umgestellt werden,
dass die sortiert-angezeigte Tabelle
nach der 1. Spalte sortiert ist.
Verwendet werden die Funktionen
split()
,
slice()
,
unshift()
und
join()
<script type="text/javascript">/*<![CDATA[*/ var str = "<table border=\"1\">\n" +"<tr><th>TITEL A</th><th>TITEL B</th><th>TITEL C\n" +"</td></tr><tr><th> cc </th><td> XX </td><td> XXX\n" +"</td></tr><tr><th> bb </th><td> YY </td><td> YYY\n" +"</th></tr><tr><th> aa </th><td> ZZ </td><td> ZZZ\n" +"</td></tr></table>"; document.write("<br />ANZEIGE VORHER<br />"+str); var arr = str.split(/<\/tr/); var rows = arr.slice(1,arr.length-1); rows.sort(); rows[rows.length] = arr[arr.length-1]; rows.unshift(arr[0]); //vorn arr[0] hinzu str = rows.join("\n<\/tr"); document.write("ANZEIGE NACHHER<br />"+str); /*]]>*/</script> |