Ich habe ein Modell mit möglicherweise Tausenden von Objekten. Ich habe mich gefragt, wie ich sie am effizientesten speichern und ein einzelnes Objekt abrufen kann, sobald ich seine ID habe. Die IDs sind lange Zahlen.
Das sind also die 2 Optionen, über die ich nachgedacht habe. In Option 1 handelt es sich um ein einfaches Array mit einem inkrementierenden Index. In Option 2 ist es ein assoziatives Array und möglicherweise ein Objekt, wenn es einen Unterschied macht. Meine Frage ist, welches effizienter ist, wenn ich meistens ein einzelnes Objekt abrufen muss, es aber manchmal auch durchlaufen und sortieren muss.
Option eins mit nicht assoziativem Array:
var a = [{id: 29938, name: 'name1'},
{id: 32994, name: 'name1'}];
function getObject(id) {
for (var i=0; i < a.length; i++) {
if (a[i].id == id)
return a[i];
}
}
Option zwei mit assoziativem Array:
var a = []; // maybe {} makes a difference?
a[29938] = {id: 29938, name: 'name1'};
a[32994] = {id: 32994, name: 'name1'};
function getObject(id) {
return a[id];
}
Aktualisieren:
OK, ich verstehe, dass die Verwendung eines Arrays in der zweiten Option nicht in Frage kommt. Die Deklarationszeile, die zweite Option, sollte also wirklich sein: var a = {};
und die einzige Frage ist: Was funktioniert besser beim Abrufen eines Objekts mit einer bestimmten ID: ein Array oder ein Objekt, bei dem die ID der Schlüssel ist.
und wird sich auch die Antwort ändern, wenn ich die Liste viele Male sortieren muss?
quelle
Antworten:
Die Kurzversion: Arrays sind meist schneller als Objekte. Es gibt jedoch keine 100% richtige Lösung.
Update 2017 - Test und Ergebnisse
Originaler Beitrag - Erklärung
Ihre Frage enthält einige Missverständnisse.
In Javascript gibt es keine assoziativen Arrays. Nur Arrays und Objekte.
Dies sind Arrays:
Dies ist auch ein Array:
Es ist im Grunde ein Array mit Löchern, da jedes Array eine kontinuierliche Indizierung aufweist. Es ist langsamer als Arrays ohne Löcher. Das manuelle Durchlaufen des Arrays ist jedoch (meistens) noch langsamer.
Dies ist ein Objekt:
Hier ist ein Leistungstest mit drei Möglichkeiten:
Lookup Array gegen Holey Array gegen Object Performance Test
Eine ausgezeichnete Lektüre zu diesen Themen im Smashing Magazine: Schreiben von schnell speichereffizientem JavaScript
quelle
if (a1[i].id = id) result = a1[i];
Sollte sein:if (a1[i].id === id) result = a1[i];
Test http://jsperf.com/array-vs-object-performance/37 korrigiert dasEs ist überhaupt keine Leistungsfrage, da Arrays und Objekte sehr unterschiedlich funktionieren (oder zumindest sollen). Arrays haben einen kontinuierlichen Index
0..n
, während Objekte beliebige Schlüssel beliebigen Werten zuordnen. Wenn Sie bestimmte Schlüssel angeben möchten, ist die einzige Auswahl ein Objekt. Wenn Sie sich nicht für die Schlüssel interessieren, handelt es sich um ein Array.Wenn Sie Menge frei wählbar (numerisch) Tasten auf einem Array versuchen, Sie haben wirklich einen Leistungsverlust , da verhaltens das Array in allen Indizes füllen in-zwischen:
(Beachten Sie, dass das Array tatsächlich keine 99
undefined
Werte enthält, sich jedoch so verhält, da Sie das Array irgendwann iterieren .)Die Literale für beide Optionen sollten sehr deutlich machen, wie sie verwendet werden können:
quelle
user_id
"vs" -Objekt mit Schlüsseln abzurufen, da auf dasuser_id
Benutzerobjektuser_id
als Schlüssel zugegriffen werden kann "? Welches ist in Bezug auf die Leistung besser? Anregungen hierzu sind willkommen :)Mit ES6 wäre die leistungsfähigste Methode die Verwendung einer Karte.
Sie können ES6-Funktionen heute mit einem Shim ( https://github.com/es-shims/es6-shim ) verwenden.
Die Leistung variiert je nach Browser und Szenario. Aber hier ist ein Beispiel, wo
Map
es am leistungsfähigsten ist: https://jsperf.com/es6-map-vs-object-properties/2REFERENZ https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map
quelle
efficiency
.Wenn Sie in NodeJS das kennen
ID
, ist die Schleife durch das Array im Vergleich zu sehr langsamobject[ID]
.Und die Ergebnisse:
Auch wenn die Such-ID die erste im Array / Objekt ist:
quelle
Ich habe versucht, dies buchstäblich in die nächste Dimension zu bringen.
Bei einem zweidimensionalen Array, bei dem die x- und y-Achse immer gleich lang sind, ist es schneller:
a) Suchen Sie die Zelle, indem Sie ein zweidimensionales Array erstellen und den ersten Index nachschlagen, gefolgt vom zweiten Index, dh:
oder
b) Erstellen Sie ein Objekt mit einer Zeichenfolgendarstellung der x- und y-Koordinaten und führen Sie dann eine einzelne Suche für dieses Objekt durch, dh:
Ergebnis: Es stellt
sich heraus, dass es viel schneller ist, zwei numerische Indexsuchen für die Arrays durchzuführen, als eine Eigenschaftssuche für das Objekt.
Ergebnisse hier:
http://jsperf.com/arr-vs-obj-lookup-2
quelle
Das hängt von der Nutzung ab. Wenn es sich um Suchobjekte handelt, ist dies sehr schnell.
Hier ist ein Plunker-Beispiel zum Testen der Leistung von Array- und Objektsuchen.
https://plnkr.co/edit/n2expPWVmsdR3zmXvX4C?p=preview
Du wirst das sehen; Übernehmen Sie Milisecons , um nach 5.000 Artikeln in einer Array-Sammlung mit 5.000 Längen zu suchen
3000
Das Suchen nach 5.000 Elementen im Objekt hat jedoch 5.000 Eigenschaften, nur Take
2
oder3
MiliseconsAuch das Erstellen eines Objektbaums macht keinen großen Unterschied
quelle
Ich hatte ein ähnliches Problem, bei dem ich Live-Kerzenhalter aus einer Ereignisquelle speichern muss, die auf x Elemente beschränkt ist. Ich könnte sie in einem Objekt speichern lassen, in dem der Zeitstempel jeder Kerze als Schlüssel und die Kerze selbst als Wert fungieren würde. Eine andere Möglichkeit war, dass ich es in einem Array speichern konnte, in dem jeder Gegenstand die Kerze selbst war. Ein Problem bei Live-Kerzen besteht darin, dass sie weiterhin Updates mit demselben Zeitstempel senden, in dem das neueste Update die neuesten Daten enthält. Daher aktualisieren Sie entweder ein vorhandenes Element oder fügen ein neues hinzu. Hier ist also ein schöner Benchmark, der versucht, alle drei Möglichkeiten zu kombinieren. Arrays in der folgenden Lösung sind im Durchschnitt mindestens viermal schneller. Fühlen Sie sich frei zu spielen
Schlussfolgerung 10 ist hier die Grenze
quelle
Wenn Sie ein sortiertes Array haben, können Sie eine binäre Suche durchführen, und das ist viel schneller als eine Objektsuche. Meine Antwort finden Sie hier:
So suchen Sie in einem sortierten Array mit Javascript schneller
quelle