2016-03-25 3 views
-1

У меня есть следующий Javascript объект:Как получить доступ к свойству вложенного объекта?

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

И у меня есть следующие функции:

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

Это работает, если я называю doSomething(doc, 'date'), но он не работает, если я использую doSomething(doc, 'send.date'). Поскольку эта функция должна быть повторно использована, как разрешить ей обрабатывать любые свойства, в том числе вложенные?

Я вижу, что lodash может быть полезным с _.get, но я использую , который не включает этот метод. Кроме того, я предпочитаю не использовать и устанавливать другие библиотеки. Есть идеи?

+0

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

+1

@elclanrs Вопрос, который вы связываете, - это проверка на существование, и этот вопрос касается доступа. –

+1

Практически то же самое, если вы можете получить к нему доступ, тогда он существует ... – elclanrs

ответ

0

Вы можете написать функцию, чтобы найти (вложенную) значение свойства, например:

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

Это вызовет ошибку при вложенных свойствах, которые не существуют. – elclanrs

+0

И он работает только на одном уровне гнездования. Может или не может быть важным. – Andy

+0

@elclanrs уверен, почему бы не бросить при попытке доступа к свойствам 'undefined'? Это как работает javascript – madox2

0

Это немного опасно в зависимости от того, что вы пытаетесь сделать, я рекомендую вам прочитать this, но Я думаю, что это будет работать:

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

Если вы хотите, чтобы проверить более чем на один уровень вложенности вы можете использовать функцию, которая использует рекурсию.

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

Смежные вопросы