OOP/DOM-Scripting JavaScript - Praxistutorial 2 - array_keys
1. Die Abschnitte
- Einführung
- Grundprinzip
- in_array
- array_keys
- array_reverse
2. Die Krux beim Prototyping
Im vorherigen Abschnitt habe ich euch gezeigt, wie Methoden beim Prototyping organisiert werden. Und ich habe auch darauf hingewiesen,
dass es besonders beim Array-Objekt zu Problemen kommt. Und das zeige ich euch nun. Daher bauen wir uns mal die PHP-Funktion
array_keys
nach, die alle Indizes eines Arrays zurückliefert.
3. Die einfache Variante
Array.prototype.array_keys = function ()
{
var tmp_key = new Array();
for (var i in this)
{
tmp_key.push(i);
}
return tmp_key;
}
bla = arr_3.array_keys();
alert (bla);
Erläuterung
Ich denke, dass diesen Code jeder von euch versteht. Oder verstehen sollte! Wir erzeugen ein "temporäres" Array namens
tmp_arr
und füllen es mit push
um die jeweiligen Indizes (i
). Allerdings sehen wir beim
alert (bla);
sofort, was passiert ist. Alle per prototype
erzeugten Methoden erscheinen wie erwartet in
unserem Array. Aber das wollen wir ja nicht.
4. Lösung 1
Im vorherigen Abschnitt habe ich euch schon gezeigt, dass typeof
bei unseren Methoden ein function
ergibt.
Und das kann man sich zu Nutze machen. Bei folgendem Code erhält man tatsächlich nur die Indizes des gewünschten Arrays.
for (var i in this)
{
if ('function' != typeof this[i])
{
tmp_key.push(i);
}
}
5. Lösung 2
Mein erster Gedanke war es, das mit einem regulären Ausdruck zu überprüfen, weil der "Wert" der "Array-Methode" immer mit
function
anfängt, also so.
for (var i in this)
{
if (!this[i].match(/^function/))
{
tmp_key.push(i);
}
}
Aber!!!
Sobald die erste Methode im Array erreicht ist, knallt es. Und warum? Ganz einfach, weil reguläre Ausdrücke nur auf Zeichenketten
angewendet werden können. Der Typ der Methode ergibt aber function
und da ist dann mit match
hängen im Schacht.
So ist es richtig
Solltet ihr wirklich mal in die Situation kommen, in einem ähnlichen Fall mit regulären Ausdrücken arbeiten zu müssen, so werdet ihr um eine
try-catch
-Anweisung nicht herumkommen. Nutzt also im Normalfall eine Überprüfung mit typeof
.
for (var i in this)
{
try
{
if (!this[i].match(/^function/))
{
tmp_key.push(i);
}
}
catch (e) { }
}
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt