2013-07-24 15 views
6

Próbuję to zrobić:Utwórz obiekt z dynamicznych nazw właściwości

var KEYS = {} ; 

KEYS.PHONE_TYPE = 'phone-type'; 
KEYS.AGENT_TYPE = 'agent-type'; 

var myAppConfig = { 
    ... 
    iconMap : { 
     KEYS.PHONE_TYPE : 'icon-phone', 
     KEYS.AGENT_TYPE : 'icon-headphones' 
    }; 
    ... 
}; 

Ale się niepowodzeniem z komunikatem: Expected ':' and instead saw '.'.

Jak mogę zainicjować obiektu przy pośrednim (nie dosłowne) keynames?

Żeby było jasne, w wyniku czego chcę to:

{ 
    'phone-type' : 'icon-phone', 
    'agent-type' : 'icon-headphones' 
} 
+0

i [Użyj połączonego (dynamicznego) ciągu znaków jako klucza obiektu JavaScript?] (Http://stackoverflow.com/q/9708192/218196) –

+0

i [dynamiczny obiekt literalny w javascript?] (http://stackoverflow.com/q/1998735/218196) –

+1

i [czy możliwe jest dodanie dynamicznie nazwanych właściwości do obiektu JavaScript ?] (http://stackoverflow.com/q/1184123/218196) –

Odpowiedz

7

Trzeba by dodać te właściwości oddzielnie przy użyciu notacji Wspornik:

var myAppConfig = { 
    ... 
    iconMap : { } 
    ... 
}; 

myAppConfig.iconMap[ KEYS.PHONE_TYPE ] = 'icon-phone'; 
myAppConfig.iconMap[ KEYS.AGENT_TYPE ] = 'icon-headphones'; 
+1

Dzięki. Nadal jestem zaskoczony, że javascript nie ma wbudowanej obsługi inicjowania obiektu z dynamicznymi nazwami. Python może to zrobić dla słowników i jest bardzo wygodny. Sądzę, że wynika to z faktu, że cytaty są opcjonalne we właściwościach javascript. – dangonfast

+0

Domyślam się, że JS porzucił tę możliwość, dopuszczając niecytowane nazwy atrybutów, Python unika tego, wymagając nazw atrybutów z cudzysłowami. – Petruza

2

Jeśli używasz ES6 (lub coś podobnego Babel/browserify), możesz napisać to tak:

iconMap : { 
    [KEYS.PHONE_TYPE] : 'icon-phone', 
    [KEYS.AGENT_TYPE] : 'icon-headphones' 
}; 
Powiązane problemy