2013-04-23 21 views
75

In meinem Code habe ich ein paar Wörterbücher (wie vorgeschlagen here), die String indiziert ist. Da dies ein bisschen improvisierter Typ ist, habe ich mich gefragt, ob es irgendwelche Vorschläge gibt, wie ich in der Lage wäre, jeden Schlüssel (oder Wert, durch den ich sowieso die Schlüssel benötige) zu durchlaufen. Jede Hilfe wird geschätzt!TypeScript, Durchlaufen eines Wörterbuchs

myDictionary: { [index: string]: any; } = {}; 
+0

Haben Sie versucht: 'for (var key in myDictionary) {}'? In der Schleife würden Sie 'key' verwenden, um den Schlüssel zu erhalten, und' myDictionary [key] ', um den Wert – Ian

+0

@Ian zu erhalten. Das habe ich gerade versucht, scheint aber nicht zu funktionieren. Keine Fehler, aber nichts läuft innerhalb der Anweisung – ben657

+1

@Ian Ah Entschuldigung, etwas Code woanders war damit zu tun. Das funktioniert perfekt! Sorge dafür, dass es eine Antwort ist, damit ich es wählen kann? – ben657

Antwort

117

Schleife über die Tastatur-/Werte, verwenden einen for in loop:

for (let key in myDictionary) { 
    let value = myDictionary[key]; 
    // Use `key` and `value` 
} 
+0

Muss der "Schlüssel" als Variablenname verwendet werden? – Yiping

+2

@Yiping Nein, aber es hilft mir klar zu machen – Ian

+2

Dies ist im Allgemeinen nicht sicher; Es benötigt den hasOwnProperty-Test (wie in Jamie Starks Antwort) oder etwas anderes. –

33

Es gibt eine Einschränkung auf den Schlüssel/Wert-Schleife, dass Ian erwähnt. Wenn es möglich ist, dass die Objekte Attribute an ihren Prototyp angehängt haben und wenn Sie den Operator in verwenden, werden diese Attribute eingeschlossen. Sie sollten also sicherstellen, dass der Schlüssel ein Attribut Ihrer Instanz und nicht des Prototyps ist. Ältere IEs sind dafür bekannt, dass indexof(v) als Schlüssel angezeigt wird.

for (var key in myDictionary) { 
    if (myDictionary.hasOwnProperty(key)) { 
     var value = myDictionary[key]; 
    } 
} 
+2

Nicht versuchen, Haare zu teilen, aber da wir Typ Skript sprechen, sollten Sie nicht Schlüssel statt var Schlüssel verwenden? Schöne Antwort danke. –

+1

In der Tat, mit der aktuellen Version des Typs Skript können 'Schlüssel' und' Wert' 'const' sein. –

41

@Alcesem hatte es fast richtig, außer dass der Vorteil dieser Methode ist, dass man nicht die hasOwnProperty() Wache mit Object.keys enthalten muss, weil der Iterator nicht weiter oben in der Prototypkette suchen. Daher ist das Folgende nicht nur sicher für Wörterbücher, sondern auch für alle Arten von Objekten in Typoskript und Javascript.

< ES 2017:

Object.keys(obj).forEach(key => { 
    let value = obj[key]; 
}); 

> = ES 2017:

Object.entries(obj).forEach(
    ([key, value]) => console.log(key, value) 
); 
+0

Dies ist die Lösung, nach der ich gesucht habe, da es mir erlaubt, die Schlüssel vor der Iteration zu sortieren – Andrew

+0

FYI, das wird derzeit auf TypeScript playground nicht unterstützt. – Seanny123

+1

Sehen Sie [hier] (http://stackoverflow.com/a/39815452/968003), wie Sie 'Object.entries' in TypeScript verwenden können –

8

Wie wäre das?

for (let [key, value] of Object.entries(obj)) { 
    ... 
} 
Verwandte Themen