如何在Javascript中轻松获取嵌套字段的值而不出现空引用异常?

如何在Javascript中轻松获取嵌套字段的值而不出现空引用异常?,javascript,jquery,javascript-framework,Javascript,Jquery,Javascript Framework,我看过很多关于在Javascript中使用中的操作符来检查对象上或对象的原型链上是否存在字段的帖子,但我没有看到过任何相反的帖子 假设我有一个对象: var obj = { myField } 而myField设置为另一个对象,其上有各种字段: obj.myField = { mySetting: true } 如果我想引用mySetting,比如在If语句中,我必须这样做: if (obj.myField && obj.myField.mySetting

我看过很多关于在Javascript中使用
中的
操作符来检查对象上或对象的原型链上是否存在字段的帖子,但我没有看到过任何相反的帖子

假设我有一个对象:

var obj = {
     myField
}
myField
设置为另一个对象,其上有各种字段:

obj.myField = {
     mySetting: true
}
如果我想引用
mySetting
,比如在If语句中,我必须这样做:

if (obj.myField && obj.myField.mySetting && obj.myField.mySetting === true)
如果我在
中使用
,它仍然很笨拙:

if ("myField" in obj && "mySetting" in obj.myField && obj.myField.mySetting === true)
以下返回false:

if ("mySetting" in obj)

是否有一些语法我不知道,可以让我写一个像样的
if
语句在这里,如果它不存在,返回false,或者如果不存在,至少不会抛出异常。我使用jQuery,因此使用它的解决方案也可以。

您检查的是
myfield
,而不是
myfield
,这就是为什么您将其视为false。记住JavaScript是区分大小写的

alert(("myField" in obj && "mySetting" in obj.myField && obj.myField.mySetting === true));

工作演示-

您正在检查
myfield
而不是
myfield
,这就是为什么您将其视为false。记住JavaScript是区分大小写的

alert(("myField" in obj && "mySetting" in obj.myField && obj.myField.mySetting === true));
工作演示-

我不确定是否有一种好的方法来描述嵌套属性,当然,为了直接检查它是否存在,您需要这样做。作为另一种选择,您可以考虑使用中间变量来支持要测试的字段:

var myField = obj.myField;
if (myField.mySetting && myField.mySetting === true) { /* do stuff */ }
最后,至少值得一提的是,您可以使用该方法检查字段是否存在。重写上面的示例:

var myField = obj.myField;
if (myField.hasOwnProperty('mySetting') && myField.mySetting === true) { 
  /* do stuff */ 
}
我不确定是否有一种很好的方法来描述嵌套属性,当然,为了直接检查它是否存在,您需要这样做。作为另一种选择,您可以考虑使用中间变量来支持要测试的字段:

var myField = obj.myField;
if (myField.mySetting && myField.mySetting === true) { /* do stuff */ }
最后,至少值得一提的是,您可以使用该方法检查字段是否存在。重写上面的示例:

var myField = obj.myField;
if (myField.hasOwnProperty('mySetting') && myField.mySetting === true) { 
  /* do stuff */ 
}
我想,你可以用一些语法上的糖分来改进这一点:

function nested_get(obj, path) {
  return path.split('.').reduce(function(p,c){return p?p[c]:p;}, obj);
}

var obj = { some: { weird: { nested: 'thing' } } };
alert(nested_get(obj, 'some.weird.nested'));
我想,你可以用一些语法上的糖分来改进这一点:

function nested_get(obj, path) {
  return path.split('.').reduce(function(p,c){return p?p[c]:p;}, obj);
}

var obj = { some: { weird: { nested: 'thing' } } };
alert(nested_get(obj, 'some.weird.nested'));

这些大写字母是打字错误。为了这个例子,请假设它们是一致的。好的,但是如果你检查我得到的结果是真的,这意味着
in
工作正常。大写字母是一个打字错误。为了这个例子,请假设它们是一致的。好的,但是如果你检查我得到的结果为true,这意味着
in
工作正常。我想我最喜欢这个解决方案。谢谢大家的想法。我想我最喜欢这个解决方案。谢谢大家的想法。