2013-02-15 18 views
6

Qual è il metodo consigliato per verificare se una proprietà oggetto come obj.prop.otherprop.another è definito?controllo JavaScript se la proprietà definita

if(obj && obj.prop && obj.prop.otherprop && obj.prop.otherprop.another) 

questo funziona bene, ma abbastanza brutto.

+0

http://stackoverflow.com/questions/135448/how-do-i-check-to-see-if-an-object-has-a-property-in-javascript – JonH

+0

@JonH no, non proprio ... –

risposta

3

Il modo più efficace per farlo è controllando obj.prop.otherprop.another in una cattura try {} (eccezione) {} blocco. Quello sarebbe il più veloce se tutti i rimanenti esistessero; altrimenti l'eccezione sarebbe gestita.

var a = null; 
try { 
    a = obj.prop.otherprop.another; 
} catch(e) { 
    obj = obj || {}; 
    obj.prop = obj.prop || {}; 
    obj.prop.otherprop = obj.prop.otherprop || {}; 
    obj.prop.otherprop.another = {}; 
    a = obj.prop.otherprop.another ; 
} 
+0

Per favore non usare questo .. questo è solo stupido da parte mia suggerire questo. – jagzviruz

0

Non dire questo è meglio, ma ...

x = null 
try { 
    x = obj.prop.otherprop.another; 
} catch() {} 
// ... 

Oppure, in alternativa ...

function resolve(obj, path) { 
    path = path.split('.'); 
    while (path.length && obj) obj = obj[path.shift()]; 
    return obj; 
} 

x = resolve(obj, 'prop.otherprop.another'); 

... ma credo che la risposta reale è che non c'è un best- pratica per questo. Non che io sappia.

0

Se siete in uno stato d'animo stupido, questo dovrebbe funzionare:

if ((((obj || {}).prop || {}).anotherprop || {}).another) { ... } 

Ma io non so se l'inizializzazione tre nuovi oggetti è davvero la pena di non dover ripetutamente digitare il percorso.

Problemi correlati