2013-02-15 11 views
6

Jaki jest zalecany sposób sprawdzenia, czy zdefiniowano właściwość obiektu, taką jak obj.prop.otherprop.ant?Sprawdzanie JavaScript, jeśli właściwość zdefiniowana

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

działa to dobrze, ale wystarczająco brzydko.

+0

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

+0

@JonH nie, niezupełnie ... –

Odpowiedz

3

Najbardziej efektywnym sposobem jest sprawdzenie obj.prop.otherprop.another w bloku try {} catch (exception) {}. Byłoby to najszybsze, gdyby wszystkie pozostałe istniały; w przeciwnym razie zostanie obsłużony wyjątek.

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

Proszę, nie używaj tego. To jest po prostu głupie, że mogę to zasugerować. – jagzviruz

0

Nie mówiąc to jest lepiej, ale ...

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

lub alternatywnie ...

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

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

... ale myślę, że rzeczywista odpowiedź brzmi, że nie jest to najlepsze- praktykuj to. Nie, że jestem świadomy.

0

Jeśli jesteś w nastroju głupie, to będzie działać:

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

Ale ja nie wiem, czy inicjowanie trzy nowe obiekty naprawdę warto nie trzeba wielokrotnie wpisać się na ścieżkę.

Powiązane problemy