molily: grosse arrays schnell durchsuchen

Beitrag lesen

Hallo,

wenn ich in einem großen Array prüfen will, ob ein Element bereits enthalten ist, muss ich ja zb mit einer for-schleife drüber jagen und zeile für zeile vergleichen.
also im prinzip:
for (blabla mit i und i++ ) {
  if (arr[i] == suchwert) alert('vorhanden');
}

Hier suchst du nach einem Wert eines Array-Elements mit einer bestimmten Nummer.

Daher die Frage: ist es schneller, wenn ich das ganze als assoziativarray baue und dann eben nur ein:

if (arr[0][suchwert] != null) alert('vorhanden');

mache?

So kannst du überprüfen, ob arr[0] ein Unterobjekt mit dem in suchwert gespeicherten Namen hat.

Ich verstehe den Vergleich nicht.

Vorab, »Assoziative Arrays« gibt es in JavaScript nicht, das sind bloße Object-Strukturen ohne die spezifischen Array-Eigenschaften.

Speicherst du bloß Werte oder Namen-Werte-Paare bzw. Nummern-Werte-Paare? Suchst du nach Namen oder nach Werten?

Wenn du bloß Werte speicherst und überprüfen willst, ob ein Werte schon gespeichert wurde, dann ein nimm ein Object.

var object = new Object();
object["name1"] = true;
object["name2"] = true;

Dann kannst du schnell mit if (object["name1"]) abfragen, ob dieser Wert gespeichert wurde. In dem Fall ist ein Object natürlich besser als ein Array, denn einen Array müsstest du durchlaufen.

Wenn du Name-Werte-Paare bzw. Nummer-Werte-Paare speichern willst, dann ist es entscheidend, ob du nach einem Namen oder nach einem Wert suchst.

Wenn der Name oder eine Nummer gegeben und der zugehörige Wert gesucht ist (bzw. geprüft werden soll, ob ein Eintrag unter dem Namen vorliegt), so geben sich Array und Object wahrscheinlich nichts. Hast du einen Array, so kannst du mit if (array[1234]) oder if (typeof a[1234] != "undefined") überprüfen, ob ein Wert unter der Nummer gespeichert ist und auf dieselbe Art den Wert abfragen. Hast du ein Object, so geht es mit if (object["1234"]) bzw. object["1234"] zum Abfragen des Wertes wahrscheinlich genauso schnell. Intern werden sowieso binäre Bäume verwendet.

Wenn der Wert gegeben ist und der zugehörige Name bzw. die Nummer gesucht ist (bzw. geprüft werden soll, ob ein Eintrag mit dem Wert vorliegt), so geben sich Array und Object wahrscheinlich auch nichts. Wenn du ein Object benutzt und nach einem Unterobjekt mit einem bestimmten Wert suchst, musst du die Unterobjekte des Objects genauso durchlaufen wie die Elemente des Arrays (for-in-Schleife). Ich wüsste auch nich, wie man in dem Fall mit binären Bäumen weiterkäme. Eher wäre ein zusätzliches Object denkbar, in den die Werte eingetragen werden, sozusagen ein Index. Also dieselbe Datenstruktur, nur Namen/Nummern und Werte sind vertauscht. Dann ist das einfache Nachschlagen über object["wert"] möglich. Der Wert müsste dann natürlich als String ausdrückbar sein.

Ich verstehe nicht ganz, in welchem Fall es einen Sinn hätte, selbst einen binären Baum in Javascript zu implementieren.

Mathias