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 sind undefined
// 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>
|