检查未知对象中的对象是否存在的最有效的Javascript方法[重复]

2023-12-03

这是我在 Javascript 中经常遇到的事情。假设我有一个这样的对象:

var acquaintances = {
   types: {
      friends: {
         billy: 6,
         jascinta: 44,
         john: 91
         others: ["Matt", "Phil", "Jenny", "Anna"]
      },
      coworkers: {
         matt: 1
      }
   }
}

在我的理论程序中,我唯一确定的是acquaintances是一个对象;我不知道是否acquaintances.types已设置,或者是否friends已被设定在其中。

如何有效检查是否acquaintances.types.friends.others exists?

我通常会做的是:

if(acquaintances.types){
  if(aquaintances.types.friends){
    if(acquaintances.types.friends.others){
       // do stuff with the "others" array here
    } 
  }
}

除了费力之外,这些嵌套的if语句的管理有点像噩梦(实际上我的对象的级别比这多得多!)。但如果我只是尝试类似的事情if(acquaintances.types.friends.others){)立即开始,并且types还没有设置,那么程序就会崩溃。

Javascript 有什么方法可以以简洁、可管理的方式做到这一点?


另一种方法是:

((acquaintances.types || {}).friends || {}).others

它比其他解决方案更短,但可能会或可能不会让您兴奋。

您还可以构建一个小助手,使相同的想法更容易接受:

function maybe(o) { return o || {}; }

现在你可以做

maybe(maybe(acquaintances.types).friends).others

如果您不介意将属性名称写为字符串,您可以制作一个小助手:

function maybe(obj) {
  return Object.defineProperty(
    obj || {}, 
    'get', 
    { value: function(prop) { return maybe(obj[prop]); }
  );
}

现在你可以写

maybe(acquaintances.types').get('friends').others

在 ES6 中,您可以使用带有默认值的解构赋值来做到这一点,尽管很笨拙:

var { types: { friends: { others } = {} } = {} } = acquaintances;

如果您想在表达式上下文中使用它,而不是分配给变量,理论上您可以使用参数解构:

(({ types: { friends: { others } = {} } = {} }) => others)(acquaintances)

归根结底,标准方法仍然存在

acquaintances.types && 
  acquaintances.types.friends && 
  acquaintances.types.friends.others

这就是为什么有一个活跃的(?)讨论在 ES6 设计组中,有一个类似 CoffeeScript 的存在运算符,但它似乎并没有很快收敛。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查未知对象中的对象是否存在的最有效的Javascript方法[重复] 的相关文章

随机推荐