【问题标题】:How to access property of a nested object?如何访问嵌套对象的属性?
【发布时间】:2016-07-13 10:12:38
【问题描述】:

我有以下 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。此外,我不喜欢使用和安装其他库。有什么想法吗?

【问题讨论】:

  • @elclanrs 您链接的问题是关于检查是否存在,而这个问题是关于访问。
  • 几乎一样的东西,如果你可以访问它,那么它就存在......

标签: javascript function object properties underscore.js


【解决方案1】:

如果您想检查不止一层的嵌套,您可以使用使用递归的函数。

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

【讨论】:

    【解决方案2】:

    这有点危险,具体取决于您要做什么,我建议您阅读this,但我认为这会起作用:

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

    【讨论】:

      【解决方案3】:

      您可以编写一个函数来查找(嵌套)属性值,例如:

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

      【讨论】:

      • 这将对不存在的嵌套属性抛出错误。
      • 而且它只适用于一层嵌套。可能重要也可能不重要。
      • @elclanrs 当然,为什么不尝试访问undefined 的属性时抛出?这就是javascript的工作原理
      • 我会避免例外。您只需要.reduce((r, p) => r && r[p], obj)
      猜你喜欢
      • 2012-11-12
      • 1970-01-01
      • 2021-03-12
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多