如何访问嵌套对象的属性?

时间:2016-03-25 16:09:37

标签: javascript function object properties underscore.js

我有以下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有帮助,但我使用的underscore不包含该方法。另外,我不想使用和安装其他库。有什么想法吗?

3 个答案:

答案 0 :(得分: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 :(得分:0)

这有点危险,取决于你想要做什么,我建议你阅读this,但我认为这会有效:

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

答案 2 :(得分: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