2010-12-13 8 views
2

Warum ist diese Rückkehr: tracker.paramsToTrack undefiniert istHilfe neue Eigenschaft Hinzufügen Objektliteral

var tracker = {}; 
var paramsToTrack = ['a', 'b', 'c', 'd', 'e']; 
for (p in paramsToTrack) 
{ 
    if(params[paramsToTrack[p]]) 
    { 
     tracker.paramsToTrack[p] = params[paramsToTrack[p]]; 
    } 

} 
console.log(tracker); 

Ich bin im Grunde params prüft wird, ob ‚a‘ bis ‚e‘ vorhanden sind. Wenn ja, fügen sie das Tracker-Objekt wie folgt:

tracker.a = Sachen

tracker.b = Sachen

Gedanken auf, was ich falsch hier?

Antwort

3
tracker.paramsToTrack[p] 

Sollte wahrscheinlich

tracker[paramsToTrack[p]] 

auch sein, und dass Sie nicht gefragt, können Sie die redundanten Array-Lookups beseitigen wollen:

var tracker = {}; 
var paramsToTrack = ['a', 'b', 'c', 'd', 'e']; 
var paramName; 
for (p in paramsToTrack) 
{ 
    paramName = paramsToTrack[p]; 
    if(params[paramName]) 
    { 
     tracker[paramName] = params[paramName]; 
    } 

} 
console.log(tracker); 

Oder noch besser, wenn Sie arbeiten, in einer modernen Javascript-Umgebung:

paramsToTrack.forEach(function (paramName) { 
    if(params[paramName]) 
    { 
     tracker[paramName] = params[paramName]; 
    } 
}); 
+0

Das wor ked! Warum funktioniert Punktnotation nicht aus Neugier? – doremi

+1

Die Punktnotation behandelt den Eigenschaftsnamen wörtlich. Sie fragen im Wesentlichen nach der Eigenschaft "paramsToTrack" des Trackers. Wirklich, was Sie wollen, ist für den Ausdruck paramsToTrack [p] ausgewertet werden, und dann das Ergebnis als der Name der Eigenschaft behandelt werden. –

+0

@Joshua McGinnis: Die folgenden zwei Notationen sind äquivalent: 'obj ['property']' und 'obj.property'. Sie können nur Variablen mit der vorherigen Schreibweise verwenden. – jwueller

Verwandte Themen