hi,
Klappt - aber das Problem ist hier, dass ich hier nicht weiß, was da passiert. Das Skript müßte man mir wirklich Zeile_für_Zeile ins Doofen-Deutsch übersetzen - und wer von Euch hat da schon Lust drauf ... ;-)
<translation from="javascript" to="doofen-deutsch">
Array.prototype.unique = function()
Dem Array-Objekt wird per prototype eine neue Methode hinzugefügt - diese besitzen danach _alle_ Array-Objekte, egal ob vorher schon oder danach erst erzeugt.
var o = {};
Die lokale Variable o wird als neues Object angelegt - ist das gleiche, wie var o = new Object();
for(var i = 0 ; i < this.length; i++)
o[this[i]] = true;
Hier passiert das "umdrehen", welches Sven schon erwähnte:
Für jedes Array-Element mit dem Wert "xyz" wird eine Object-Eigenschaft xyz hinzugefügt, und mit dem Wert true versehen.
Da Objekteigenschaften eindeutige Namen haben, würde das nächste Array-Element, dessen Wert auch "xyz" ist, hier keine weitere Objekt-Eigenschaft erzeugen, sondern die bereits vorhandene überschreiben - wiederum mit dem Wert true.
Wir haben also nach Ablauf dieser Schleife ein Objekt, welches für jeden _mindestens_ einmal im Array vorkommenden Wert eine gleichnamige Eigenschaft mit dem Wert true besitzt. Kam ein Wert im Array mehrmals vor, haben wir trotzdem nur _genau eine_ solche Eigenschaft - weil wegen Eindeutigkeit von Eigenschaftnamen und "Überschreibung".
Also haben wir jetzt schon dafür gesorgt, dass die mehrmals vorkommenden Werte nur noch einmal vorhanden sind - nur derzeit noch "auf der falschen Seite", denn wenn wir ein Objekt mal als assoziatives Array ansehen, haben wir jetzt unsere Werte als Schlüssel - also müssen wir jetzt noch aus Schlüsseln wieder Werte machen, und einen neuen fortlaufenden nummerischen Index erzeugen.
var tmp = new Array();
Jetzt wird ein neues Array angelegt,
for(var i in o) tmp[tmp.length] = i;
und für jede Eigenschaft des Objektes o, deren Eigenschaften-Namen die for-in-Schleife in i liefert, ein neues Array-Element angelegt.
(Neue Elemente ans Ende eines nummerischen Arrays anfügen kann man nicht nur über die push-Methode, sondern auch, in dem man dem nächstfolgenden Index einfach den entsprechenden Wert zuweist. Und da Javascript bei 0 an zu zählen fängt, liefert in einem nummerischen Array mit fortlaufenden Schlüsseln die length-Eigenschaft immer den nächsten "noch freien" Index.)
return tmp;
Und jetzt wird noch das so neu erzeugte Array als Rückgabewert der Methode unique() zurückgegeben.
</translation>
gruß,
wahsaga
/voodoo.css:
#GeorgeWBush { position:absolute; bottom:-6ft; }