82 Stimmen

Objekte vs Arrays in JavaScript für Schlüssel/Wert-Paare

Sagen Sie, Sie haben eine sehr einfache Datenstruktur:

(personId, name)

... und Sie möchten eine Anzahl davon in einer JavaScript-Variablen speichern. Meiner Meinung nach haben Sie drei Möglichkeiten:

// ein einzelnes Objekt
var people = {
    1 : 'Joe',
    3 : 'Sam',
    8 : 'Eve'
};

// oder, ein Array von Objekten
var people = [
    { id: 1, name: 'Joe'},
    { id: 3, name: 'Sam'},
    { id: 8, name: 'Eve'}
];

// oder, eine Kombination aus beidem
var people = {
    1 : { id: 1, name: 'Joe'},
    3 : { id: 3, name: 'Sam'},
    8 : { id: 8, name: 'Eve'}
};

Die zweite oder dritte Option ist offensichtlich der richtige Weg, wenn Sie mehr als einen "Wert" speichern möchten (z.B. das Hinzufügen ihres Alters oder ähnliches) oder erwarten, dass Sie mehr als einen "Wert" speichern könnten. Angenommen, es wird niemals weitere Datenwerte in dieser Struktur geben. Welche wählen Sie und warum?


Bearbeiten: Das Beispiel zeigt nun die häufigste Situation: nicht zusammenhängende IDs.

58voto

Dan Lew Punkte 83507

Jede Lösung hat ihre Anwendungsfälle.

Ich denke, die erste Lösung ist gut, wenn Sie eine Eins-zu-eins-Beziehung definieren möchten (wie zum Beispiel eine einfache Zuordnung), insbesondere wenn Sie den Schlüssel als Suchschlüssel verwenden müssen.

Die zweite Lösung erscheint mir insgesamt am robustesten, und ich würde sie wahrscheinlich verwenden, wenn ich keinen schnellen Suchschlüssel benötige:

  • Es ist selbsterklärend, sodass Sie nicht darauf angewiesen sind, dass jemand people verwendet, um zu wissen, dass der Schlüssel die ID des Benutzers ist.
  • Jedes Objekt ist selbsterklärend, was es besser macht, die Daten anderswohin zu übergeben - anstatt zwei Parameter (ID und Name) übergeben Sie einfach Personen.
  • Dies ist ein seltens Problem, aber manchmal können die Schlüsselwerte möglicherweise nicht als Schlüssel verwendet werden. Zum Beispiel wollte ich einmal Zeichenfolgenkonvertierungen abbilden (z.B. ":" zu ">"), aber da ":" kein gültiger Variablenname ist, musste ich die zweite Methode verwenden.
  • Es ist leicht erweiterbar, falls Sie irgendwann mehr Daten für einige (oder alle) Benutzer hinzufügen müssen. (Entschuldigung, ich kenne Ihr "nur der Argumentation willen", aber dies ist ein wichtiger Aspekt.)

Die dritte Lösung wäre gut, wenn Sie eine schnelle Suchzeit + einige der oben aufgeführten Vorteile benötigen (Datenübertragung, selbsterklärend). Wenn Sie jedoch die schnelle Suchzeit nicht benötigen, ist es viel umständlicher. Außerdem besteht in jedem Fall das Risiko eines Fehlers, wenn die ID im Objekt sich irgendwie von der ID in people unterscheidet.

7voto

derobert Punkte 47691

Eigentlich gibt es eine vierte Option:

var people = ['Joe', 'Sam', 'Eve'];

da deine Werte zufällig aufeinander folgen. (Natürlich musst du eins addieren/subtrahieren --- oder einfach undefined als erstes Element setzen).

Persönlich würde ich mich für deine (1) oder (3) entscheiden, weil dies am schnellsten ist, um jemanden anhand der ID zu finden (im schlimmsten Fall O(logn). Wenn du die ID 3 in (2) finden musst, kannst du entweder nach Index suchen (dann ist mein (4) okay) oder suchst — O(n).

Klarstellung: Ich sage O(logn) ist das Schlimmste, was passieren könnte, weil, soweit ich weiß, eine Implementierung entscheiden könnte, einen ausbalancierten Baum anstelle einer Hashtabelle zu verwenden. Eine Hashtabelle wäre O(1), unter der Annahme minimaler Kollisionen.

Bearbeitung von nickf: Ich habe das Beispiel im OP geändert, deshalb macht diese Antwort möglicherweise nicht mehr so viel Sinn. Entschuldigung.

Nach der Bearbeitung

Ok, nach der Bearbeitung würde ich Option (3) wählen. Diese ist erweiterbar (einfach neue Attribute hinzuzufügen), bietet schnelle Suchvorgänge und kann auch iteriert werden. Es ermöglicht auch, von einem Eintrag zur ID zurückzukehren, falls erforderlich.

Option (1) wäre nützlich, wenn (a) du Speicherplatz sparen musst; (b) du nie von Objekt zu ID zurückkehren musst; (c) die gespeicherten Daten nie erweitert werden müssen (z.B. du kannst den Nachnamen der Person nicht hinzufügen)

Option (2) ist gut, wenn du (a) die Reihenfolge beibehalten musst; (b) alle Elemente durchlaufen musst; (c) Elemente nicht nach ID suchen musst, es sei denn, sie sind nach ID sortiert (du kannst eine binäre Suche in O(logn) durchführen). Natürlich, wenn du es sortiert halten musst, zahlst du einen Preis beim Einfügen.

2voto

karim79 Punkte 333786

Vorausgesetzt, die Daten ändern sich nie, ist die erste (einzige Objekt) Option die beste.

Die Einfachheit der Struktur bedeutet, dass sie am schnellsten analysiert werden kann, und im Fall kleiner, selten (oder nie) ändernder Datensätze wie diesem, kann ich mir nur vorstellen, dass sie häufig ausgeführt wird - in welchem Fall minimale Overheads der Weg sind.

2voto

scaraveos Punkte 986

Ich habe eine kleine Bibliothek erstellt, um Schlüssel-Wert-Paare zu verwalten.

https://github.com/scaraveos/keyval.js#readme

Es verwendet

  • ein Objekt zur Speicherung der Schlüssel, was schnelle Lösch- und Wertabrufoperationen ermöglicht, und
  • eine verkettete Liste, um wirklich schnelle Iterationen über die Werte zu ermöglichen

Ich hoffe, es hilft :)

1voto

levik Punkte 108445

Die dritte Option ist die beste für jede zukunftsorientierte Anwendung. Sie werden wahrscheinlich weitere Felder zu Ihrem Personen-Datensatz hinzufügen wollen, daher ist die erste Option ungeeignet. Außerdem ist es sehr wahrscheinlich, dass Sie eine große Anzahl von Personen speichern müssen und schnell auf Datensätze zugreifen möchten - daher ist es auch keine gute Idee, sie einfach in ein einfaches Array zu speichern (wie es in Option #2 gemacht wird).

Das dritte Muster gibt Ihnen die Möglichkeit, jede Zeichenfolge als ID zu verwenden, komplexe Personenstrukturen zu haben und Personen-Datensätze in konstanter Zeit abzurufen und zu setzen. Das ist definitiv der richtige Weg.

Was option #3 fehlt, ist eine stabile deterministische Sortierung (das ist der Vorteil von Option #2). Wenn Sie dies benötigen, würde ich empfehlen, ein geordnetes Array von Personen-IDs als separate Struktur zu behalten, für den Fall, dass Sie Personen in einer bestimmten Reihenfolge auflisten müssen. Der Vorteil wäre, dass Sie mehrere solcher Arrays für verschiedene Reihenfolgen desselben Datensatzes behalten können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X