2016-03-25 11 views
-1

Ich habe folgende Javascript-Objekt:Wie kann auf die Eigenschaft eines verschachtelten Objekts zugegriffen werden?

doc = {}; 
doc.title = 'a title'; 
doc.date = 'a date'; 
doc.send = { 
    date: new Date(), 
    sender: 'a sender', 
    receiver: 'a receiver' 
}; 

Und ich habe die folgende Funktion:

doSomething(item, property) { 
    console.log(item[property]; 
} 

Es funktioniert, wenn ich doSomething(doc, 'date') nennen, aber es funktioniert nicht, wenn ich doSomething(doc, 'send.date') verwenden. Da diese Funktion wiederverwendbar sein muss, wie kann sie jede Art von Eigenschaft behandeln, einschließlich verschachtelter?

Ich sehe, dass lodash mit _.get hilfreich sein könnte, aber ich verwende underscore, die diese Methode nicht enthalten. Außerdem bevorzuge ich es, keine anderen Bibliotheken zu verwenden und zu installieren. Irgendeine Idee?

+0

Dup? http://stackoverflow.com/questions/2631001/javascript-test-for-existence-of-nested-object-key – elclanrs

+1

@elclanrs Die Frage, die Sie verknüpften, ist über die Existenz zu prüfen, und dies ist über den Zugriff. –

+1

So ziemlich die gleiche Sache, wenn Sie darauf zugreifen können, dann existiert es ... – elclanrs

Antwort

0

Sie eine Funktion schreiben können (verschachtelten) Eigenschaftswert, zum Beispiel zu finden:

function findDeepProp(obj, prop) { 
    return prop.split('.').reduce((r, p)=> r[p], obj) 
} 
findDeepProp(doc, 'title'); // a title 
findDeepProp(doc, 'send.sender'); // a sender 
+1

Dies wird einen Fehler für verschachtelte Eigenschaften, die nicht existieren, werfen. – elclanrs

+0

Und es funktioniert nur auf einer Ebene der Verschachtelung. Kann oder darf nicht wichtig sein. – Andy

+0

@elclanrs sicher, warum nicht zu werfen, wenn Sie versuchen, auf Eigenschaften von 'undefined' zuzugreifen? So funktioniert Javascript – madox2

0

Dies etwas gefährlich ist, je nachdem, was Sie zu tun versuchen, empfehle ich Sie this zu lesen, aber ich denke, dass dies funktionieren wird:

doSomething = function(element, property){ 
    console.log(eval("element." + property)); 
} 
0

Wenn Sie mehr als eine Ebene der Verschachtelung könnten Sie eine Funktion verwenden, die Rekursion verwendet, um überprüfen wollen.

var doc = { 
    title: 'a title', date: 'a date', 
    send: { date: +new Date(), sender: 'a sender', receiver: 'a receiver', 
    thing: { 
     fullname: { first: 'Bob', last: 'Smith' } 
    } 
    } 
} 

function findDeepProp(obj, prop) { 

    // create an array from the props argument 
    var target = prop.split('.'), out; 

    // iteration function accepts an object and target array 
    (function iterate(obj, target) { 

    // remove the first array element and assign it to tmp 
    var tmp = target.shift(); 

    // if target has no more elements and tmp 
    // exists as a key in the object passed into iterate() 
    // return its value 
    if (target.length === 0 && obj[tmp]) return out = obj[tmp]; 

    // if the key exists in the object passed into iterate() 
    // but it is an object, run iterate() with that object 
    // and the reduced target array 
    if (obj[tmp] && typeof obj[tmp] === 'object') iterate(obj[tmp], target); 

    return; 
    }(obj, target)); 

    return out; 
} 

findDeepProp(doc, 'send.thing.fullname.first') // Bob 
findDeepProp(doc, 'send.thing.fullname.last') // Smith 

DEMO

Verwandte Themen