更短的方法:if(a!== undefined&& a.b!== undefined&& a.b.c ===' foo')

时间:2017-05-22 19:05:01

标签: javascript object lodash

如果我需要检查一个对象的属性及其对象(等等)但是不能确定该对象是否存在,那么我怎样才能使该条件比此?

if (a !== undefined && a.b !== undefined && a.b.c === 'foo')

如果它有任何有意义的功能,我也会使用 LoDash

4 个答案:

答案 0 :(得分:4)

Lodash有_.get,它允许您定义对象中嵌套项的键路径。它会为您处理中间检查,如果找不到密钥则只返回composer dump-autoload或默认值。

undefined

答案 1 :(得分:4)

如果你知道a在当前范围内(比如作为参数加入),你可以这样做 if(a && a.b && a.b.c === 'foo')
如果永远无法定义a,您必须检查类型如下:
if( typeof a != 'undefined' && a.b && a.b.c === 'foo')

<强>更新
当使用lodah时,has函数可以提供更好的语法(与get函数不同,如果属性是伪值,则返回true。感谢@ryeballar): if(lodash.has(a,'b.c')){ console.log(a.b.c); }

答案 2 :(得分:2)

如果a确实不存在,那么您将需要 try / catch ,这意味着您可以这样做:

try {
    if (a.b.c === 'foo') {
        // Do stuff.
    }
} catch (ignore) {}

答案 3 :(得分:1)

在您担心缩短代码之前,您需要知道在a不存在时您的代码会出错:

if (a !== undefined && a.b !== undefined && a.b.c === 'foo'){
  console.log("a exists, a.b exists and a.b.c === 'foo'");
}

如果没有收到错误,您将无法访问不存在的对象。因此,您需要检查a类型以查看它是否为"undefined"(注意,要检查的值是字符串)。

function checkObj(){
  if (typeof a !== "undefined" && a.b && a.b.c === 'foo'){
    console.log("a exists, a has a b property and a.b.c === 'foo'");
  } else {
    console.log("Not all conditions met.");
  }
}

checkObj();  // a doesn't exist --> "Not all conditions met."

var a = {};

checkObj(); // a exists, but b and c don't --> "Not all conditions met."

a.b = {};

checkObj();  // a and b exist but c doesn't --> "Not all conditions met."

a.b.c = "test";

checkObj();  // a, b and c exist, but c has wrong value --> "Not all conditions met."

a.b.c = "foo";

checkObj();  // "a exists, a has a b property and a.b.c === 'foo'"