2011-01-13 13 views

Antwort

32

Im Allgemeinen können Sie if(property in object) verwenden, aber dies wäre für verschachtelte Mitglieder immer noch umständlich.

Sie könnten eine Funktion schreiben:

function test(obj, prop) { 
    var parts = prop.split('.'); 
    for(var i = 0, l = parts.length; i < l; i++) { 
     var part = parts[i]; 
     if(obj !== null && typeof obj === "object" && part in obj) { 
      obj = obj[part]; 
     } 
     else { 
      return false; 
     } 
    } 
    return true; 
} 

test(someObject, 'member.member.member.value'); 

DEMO

+0

Sieht gut aus. Ich mag den Looping-Ansatz, aber wie hilft der __typeof obj === "object" __ genau? Ist es nicht wahr, dass typeof auch ein Objekt für null und ein Array zurückgeben kann? – JustcallmeDrago

+0

@JustcallmeDrago: True ... wäre für das Array nicht so wichtig, aber es würde für "null" fehlschlagen. Es ist also vielleicht besser, einen Scheck für null hinzuzufügen. Ich habe den Test hinzugefügt, weil "Wert" in 'einen Fehler auslösen würde. Test 'Null' hinzugefügt. –

+0

@Felix: Ich verstehe. Ich mag die Saite als Argument, aber auch die Einfachheit von Patricks Antwort. Ist seine so sicher wie deine? Ist es so schnell? – JustcallmeDrago

2

So etwas wie (Achtung: nicht getesteten Code voraus)

var testProperty = function(obj, proplist) { 
    for (var i=0; i < proplist.length; i++) { 
     if (obj.hasOwnProperty(proplist[i])) { 
     obj = obj[proplist[i]]; 
     } else { 
     return false; 
     } 
    } 
    return true; 
} 
+0

Sollte 'proplist.length' sein. –

+0

@Felix - danke, behoben.Siehe auch Phrogz 'Antwort für eine Alternative zu hasOwnProperty – Malvolio

+0

Siehe den Kommentar zu meiner Antwort, deins würde auch fehlschlagen, wenn 'obj'' null' ist. –

2
if (someObject.member && someObject.member.member && 
    someObject.member.member.member && someObject.member.member.member.value) ... 

oder ähnlich:

var val = foo.bar && foo.bar.jim && foo.bar.jim.jam && foo.bar.jim.jam.value; 

Dies wird nicht 'Arbeit', wenn ein bestimmter Wert null, sein geschieht false, 0, oder "" (eine leere Zeichenfolge), aber mit der möglichen Ausnahme des endgültigen Werts scheint dies nicht der Fall zu sein.

Beachten Sie auch, dass typeof ____ !== "undefined" nicht der richtige Test ist, um festzustellen, ob ein Objekt eine Eigenschaft besitzt. Stattdessen sollten Sie ___ in object, z. if ("member" in someObject). Dies liegt daran, dass Sie eine Eigenschaft auf einen expliziten Wert von undefined festlegen können, der sich von dem Entfernen mit delete someObject.member unterscheidet.

4

hier seinen Weg: http://jsfiddle.net/9McHq/

var result = ((((someObject || {}).member || {}).member || {}).member || {}).value; 

alert(result); 
+0

Schön. Sicher kann dies ziemlich leicht in eine rekursive Funktion umgewandelt werden! – JustcallmeDrago

5

Sie könnten auch fangen versuchen Typeerror /?

try { 
    console.log(someObject.member.member.member.value); 
} catch(e) { 
    if (e instanceof TypeError) { 
    console.log("Couldn't access someObject.member.member.member.value"); 
    console.log(someObject); 
    } 
} 
2

Theres eine safeRead Funktion here on thecodeabode definiert, die dh

safeRead(foo, 'bar', 'jim', 'jam'); 

eine safeRead verschachtelter Eigenschaften ermöglicht, wenn eine der Eigenschaften null sind oder nicht definiert eine leere Zeichenkette zurückgegeben - nützlich für die Formatierung/string Interpolations

+0

Ich mag diese Lösung wirklich – Sukima

+0

Dieser Code ist schlecht geschrieben und funktioniert nicht. – Coldstar

0

Wenn Sie lodash Bibliothek verwenden können, ist es eine sehr elegante Lösung hat, hasIn.

_.hasIn(someObject, 'member.level1.level2.level3'); 

zum Beispiel

var obj = {'x': 999, 'a': {'b': {'c': 123, 'd': 234}}} 
// => undefined 

_.hasIn(obj, 'x') 
// => true 

_.hasIn(obj, 'a.b.d') 
// => true 

_.hasIn(obj, 'a.b.e') 
// => false 
Verwandte Themen