Javascript 如何优雅地检查连续对象的存在

Javascript 如何优雅地检查连续对象的存在,javascript,Javascript,有没有办法写得更优雅一些 if ("a" in obj && "b" in obj.a && "c" in obj.a.b) 而不是检查对象的每个阶段是否存在 如果我做了If(obj.a.b中的“c”)如果a或b不存在,这将产生错误。我总是发现lodash和函数非常强大,您可以访问对象中的深度嵌套值,而无需大量代码来检查路径是否存在 例如: constobj={a:{b:{c:42}}; 如果(uu.

有没有办法写得更优雅一些

if ("a" in obj && "b" in obj.a && "c" in obj.a.b)
而不是检查对象的每个阶段是否存在


如果我做了
If(obj.a.b中的“c”)
如果
a
b
不存在,这将产生错误。

我总是发现lodash和函数非常强大,您可以访问对象中的深度嵌套值,而无需大量代码来检查路径是否存在

例如:

constobj={a:{b:{c:42}};
如果(uu.has(obj,“a.b.c”)){
log(“路径存在”);
}
//安全访问,如果路径不存在,将返回未定义。。。
log(“路径值:”,j.get(obj,“a.b.c”)
deep helper函数 此curried函数可以通过使用pulldeep函数的第一个参数来确定属性是否存在。

Old way 新方式


如果您的运行时支持它,您可以使用可选的链接
if(obj?.a?.b???{})中的(“c”)
function pluckDeep(key) {

   return function(obj) {

        return key.split('.').reduce((accum, key) => {
            return accum[key]
        }, obj);

   }

}

const obj = { a: { b: { c: 42 }}};


if (pluckDeep('a.b.c')(obj)) {
  // do something
}
if (obj.a && obj.a.b && obj.a.b.c) {
  // do something
}
if (obj.a?.b?.c) {
  // do something
}