2012-04-02 5 views
3

Ich habe diese beiden Datenstrukturen, die ich mir die Wahl zwischen immer wieder finden, wenn Daten aus einer Datenbank ziehen:Datenstruktur beste Praxis in Bezug auf eindeutige ID des

{ 
    "1": {"location": "seattle", "color": "red"}, 
    "2": {"location": "irvine", "color": "blue"}, 
    "3": {"location": "san diego", "color": "green"} 
} 

{ 
    "listings":[ 
     {"id": "1", "location": "seattle", "color": "red"}, 
     {"id": "2", "location": "irvine", "color": "blue"}, 
     {"id": "3", "location": "san diego", "color": "green"} 
    ] 
} 

Jeder scheint Vor-und Nachteile zu haben ...

Die Objektstruktur ist großartig für den schnellen Zugriff auf einen Wert mit einer ID durch obj['3'].color Das Problem ist, wenn Sie alle Objekte auflisten, die Sie Schleife mit einer for(key in obj)-Schleife, die sehr langsam zu sein scheint.

Die Array-Struktur läuft viel schneller unter Verwendung von for(var i=0; i<array.length; i++), aber den Zugriff auf einen Wert mit einer ID ist nicht einfach aus der Box. Sie müssen eine Funktion erstellen, die das gesamte Array durchläuft und die ID anhand eines angegebenen Parameters überprüft.

Hier ist eine jsperf der beiden Lösungen.

Was denken Sie ist besser und warum?

+2

Sie haben ein JavaScript-Objekt und Array, aber kein JSON hier. Wenn Sie die Daten als JSON an den Client übertragen, ist das in Ordnung, aber sobald die Daten analysiert sind, haben Sie es nicht mehr mit JSON zu tun. –

+0

Es ist das Gleiche. Angenommen, der Server gibt entweder ein als JSON analysiertes Objekt oder ein als JSON analysiertes Array zurück. – alnafie

+0

Es ist nicht. JSON ist ein Datenaustauschformat, während ein JavaScript-Array oder -Objekt ein Datentyp in JavaScript ist. Lassen Sie sich von der ähnlichen Syntax nicht täuschen. Wenn Ihr Problem darin besteht, herauszufinden, welche Datenstruktur für Ihren Zweck am besten geeignet ist, hat es überhaupt nichts mit JSON zu tun. –

Antwort

1

Wie immer ist die Antwort: Es kommt darauf an. Werden Sie die Objekte meist zufällig über ihre id zugreifen? Dann benutze das Objekt. Wirst du sie meistens in der Reihenfolge durchlaufen? Dann benutze ein Array.

Natürlich können Sie beides tun, indem Sie ein Array zurückgeben und dann einen Index über den Wert id erstellen. Z. B.

var arr = /*...wherever you get your second example, the array...*/; 
var index, len, entry; 
arr.index = {}; 
for (index = 0, len = arr.length; index < len; ++index) { 
    entry = arr[index]; 
    arr.index[entry.id] = entry; 
} 

(Ich habe eine Funktion, die dies tut, weil ich es eine nützliche Technik in regelmäßigen Abständen finden.)

Jetzt können Sie eine Schleife durch sie mit einer Schleife oder zufällig sie über arr.index["some_id"] zugreifen. Beachten Sie, dass Sie bei der Änderung vorsichtig sein müssen (z. B. sicherstellen, dass Sie Löschungen und Ergänzungen an beiden Stellen vornehmen).

Beachten Sie, dass ich eine Immobilie auf dem tatsächlichen Array verwendet haben, genannt index (der Name kann sein, was Sie wollen, ich häufig index oder byId oder ähnliches verwenden). Manche Leute mögen es nicht, Nicht-Index-Eigenschaften für Arrays zu verwenden. Ich habe kein Problem damit, seit Arrays are really just objects anyway. Aber Sie müssen nicht, Sie können den Index in einer eigenen Variablen als Peer von arr verfolgen.

Beachten Sie auch, dass, während es kann ein absolute Unterschied in der Geschwindigkeit der Iteration mit for..in auf dem Objekt gegenüber for auf dem Array, die Chancen, dort zu sein jede realen Auswirkungen auf dieser Geschwindigkeit von Iteration ist sehr niedrig.

+0

könnten Sie näher auf "Rückgabe eines Arrays und dann erstellen einen Index über ID-Wert"? – alnafie

+0

@alnafie: Fertig. –