2016-03-25 24 views
-1

Aşağıdaki JavaScript nesnesi vardır:Yuvalanmış bir nesnenin özelliğine nasıl erişilir?

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

Ve aşağıdaki işlevi vardır:

i doSomething(doc, 'date') diyoruz, ama doSomething(doc, 'send.date') kullanmak işe yaramazsa Çalışıyor
doSomething(item, property) { 
    console.log(item[property]; 
} 

. Bu işlev tekrar kullanılabilir olması gerektiğinden, iç içe geçmiş dahil olmak üzere herhangi bir özellik türünü kullanma izni nasıl verilir?

Bu_.get ile yararlı olabilir, ancak bu yöntemi içermeyen underscore kullanıyorum. Ayrıca diğer kütüphaneleri kullanmamayı ve kurmamayı tercih ediyorum. Herhangi bir fikir?

Örneğin, (iç içe) özellik değerini bulmak için bir işlev yazabilirsiniz
+0

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

+1

@elclanrs Bağladığınız soru, varlığı kontrol etmekle ilgili olup, bu erişim ile ilgilidir. –

+1

Hemen hemen aynı şey, eğer ona erişebiliyorsan, o zaman var ... – elclanrs

cevap

0

: Bu yapmaya çalıştığımız şeye bağlı olarak biraz tehlikelidir

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

Bu, iç içe geçmiş özelliklerde bir hata atar. – elclanrs

+0

Ve sadece tek bir yuvalama düzeyinde çalışır. Önemli ya da olmayabilir. – Andy

+0

@elclanrs, 'undefined' özelliklerine erişmeye çalışırken neden atmamak? Bu nasıl javascript – madox2

0

, ben this okumanızı tavsiye ama Bence bu işe yarar:

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

Birden fazla yuvalanma düzeyini kontrol etmek isterseniz, tekrarlama kullanan bir işlev kullanabilirsiniz.

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

İlgili konular