2013-04-23 21 views
75

Nel mio codice, ho un paio di dizionari (come suggerito here) che è indicizzato String. Dato che è un po 'un tipo improvvisato, mi chiedevo se ci fossero suggerimenti su come sarei in grado di passare in rassegna ogni chiave (o valore, tutto ciò di cui ho bisogno comunque per le chiavi). Qualsiasi aiuto apprezzato!TypeScript, looping attraverso un dizionario

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

Hai provato: 'for (var chiave in MyDictionary) {}'? All'interno del ciclo, dovresti usare "chiave" per ottenere la chiave, e "myDictionary [chiave]" per ottenere il valore – Ian

+0

@Ian appena provato, non sembra funzionare. Nessun errore, ma nulla viene eseguito all'interno dell'istruzione – ben657

+1

@Ian Ah, scusate, un po 'di codice in altri casi ha funzionato. Funziona perfettamente! Vuoi fare una risposta così posso sceglierla? – ben657

risposta

117

Per eseguire un ciclo negli chiave/valori, utilizzare un ciclo for in:

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

È necessario utilizzare la "chiave" come nome della variabile? – Yiping

+2

@Yiping Nope, ma mi aiuta a chiarire il problema – Ian

+2

Questo non è sicuro in generale; ha bisogno del test hasOwnProperty (come nella risposta di Jamie Stark) o di qualcos'altro. –

33

C'è un avvertimento al loop chiave/valore che Ian menzionato. Se è possibile che gli oggetti abbiano attributi collegati al loro prototipo e quando si utilizza l'operatore in, questi attributi saranno inclusi. Quindi vorrai assicurarti che la chiave sia un attributo della tua istanza, e non del prototipo. Gli IE meno recenti sono noti per avere indexof(v) come chiave.

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

Non tentare di dividere i capelli, ma dal momento che stiamo parlando di script di tipo, non dovresti usare let key invece di var key? Bella risposta grazie. –

+1

Infatti, con la versione corrente di tipo script, 'chiave' e' valore' possono essere 'const'. –

41

@Alcesem aveva quasi diritto a meno che il beneficio di tale metodo è che uno non ha bisogno di includere la guardia hasOwnProperty() con Object.keys perché l'iteratore non cercherà più in alto nella catena di prototipi. Pertanto, quanto segue non è sicuro solo per i dizionari, ma per qualsiasi tipo di oggetto sia in Typescript che in 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

Questa è la soluzione che stavo cercando in quanto mi permetterà di ordinare i tasti prima dell'iterazione – Andrew

+0

FYI, al momento non è supportato su un campo di gioco TypeScript. – Seanny123

+1

Vedere [here] (http://stackoverflow.com/a/39815452/968003) come rendere 'Object.entries' per funzionare in TypeScript –

8

ne dici di questo?

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