2013-01-02 8 views
6

Załóżmy, że mam złożony obiekt json x z mieszanymi obiektami i tablicami. Czy istnieje prosty lub ogólny sposób, aby sprawdzić, czy zmienna jest zerowy lub niezdefiniowane w tym obiekcie, takie jak:Uzyskaj zagnieżdżoną wartość JSON/obiektu bez potrzeby wielu pośrednich kontroli?

if(x.a.b[0].c.d[2].e!=null) .... 

zamiast normalnie sprawdzanie wszystkich pól macierzyste

if(x.a!=null 
&& x.a.b!=null 
&& x.a.b[0]!=null 
&& x.a.b[0].c!=null 
&& x.a.b[0].c.d!=null 
&& x.a.b[0].c.d[2]!=null 
&& x.a.b[0].c.d[2].e!=null) .... 
+0

(Sprawdzanie, czy ostatnia wartość jest niezdefiniowana/null jest tylko podzbiorem całego zadania.) –

+0

nie widzę żadnego JSON w tej kwestii ... –

Odpowiedz

6
try { 
    if(x.a.b[0].c.d[2].e!=null) 
    //.... 
} catch (e) { 
    // What you want 
} 

Live DEMO

+2

@SayemAhmed I przegap 'FALSE oraz '0' i' '" 'case! O.o –

3

Oto wariant, który nie wymaga obsługi wyjątku. Czy będzie on szybszy? Wątpię. Czy będzie czystszy? Cóż, to zależy od osobistych preferencji. Oczywiście to tylko mały demonstracyjny prototyp i jestem pewien, że istnieją już lepsze biblioteki "zapytań JSON", które już istnieją.

// returns the parent object for the given property 
// or undefined if there is no such object 
function resolveParent (obj, path) { 
    var parts = path.split(/[.]/g); 
    var parent; 
    for (var i = 0; i < parts.length && obj; i++) { 
     var p = parts[i]; 
     if (p in obj) { 
      parent = obj; 
      obj = obj[p]; 
     } else { 
      return undefined; 
     } 
    } 
    return parent; 
} 

// omit initial parent/object in path, but include property 
// and changing from [] to . 
var o = resolveParent(x, "a.b.0.c.d.2.e"); 
if (o) { 
    // note duplication of property as above method finds the 
    // parent, should it exist, so still access the property 
    // as normal 
    alert(o.e); 
} 
+0

nie działa, jeśli [] zawiera zmienną i. – konghou

+0

@konghou Rzeczywiście - jest to dalekie od tego, co uważam za godne produkcji! Byłem, być może przesadnie, zainteresowany pokazaniem jednego podejścia do iterowania właściwości. –

+0

+1, bardzo ładne! (ale tylko do celów edukacyjnych). – gdoron