![](/img/trans.png)
[英]How do I dynamically get the value of a nested object property in JavaScript?
[英]How do I easily get the value of a nested field in Javascript without null reference exceptions?
我已经看到很多关于在Java中使用in
运算符检查对象上是否存在字段或对象原型链中是否存在文章的文章,但是我没有看到相反的情况。
假设我有一个对象:
var obj = {
myField
}
并且myField
设置为另一个对象,上面有各种字段:
obj.myField = {
mySetting: true
}
如果要引用mySetting
,让我们在if语句中说,我必须做这样的事情:
if (obj.myField && obj.myField.mySetting && obj.myField.mySetting === true)
如果我使用in
,它仍然很笨拙:
if ("myField" in obj && "mySetting" in obj.myField && obj.myField.mySetting === true)
以下返回false:
if ("mySetting" in obj)
是否有一些我不知道的语法可以使我在此处编写一个体面的if
语句,如果不存在则返回false,或者禁止它,至少不会引发异常。 我使用jQuery,因此也可以使用该解决方案。
var a = { b: { c: { d: 10 } } };
var res = [ 'b', 'c', 'd' ].reduce(function(p, c) {
return p ? p[c] : p;
}, a);
我想可以用一些语法糖来改善它:
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'));
您正在检查的是myfield
而不是myField
,这就是为什么将其作为false的原因。 请记住,JavaScript区分大小写。
alert(("myField" in obj && "mySetting" in obj.myField && obj.myField.mySetting === true));
工作演示-http: //jsfiddle.net/Yfuvu/
我不确定是否有一种描述嵌套属性的好方法,您当然需要这样做才能直接检查它是否存在。 或者,您可以考虑使用中间变量代替要测试的字段:
var myField = obj.myField;
if (myField.mySetting && myField.mySetting === true) { /* do stuff */ }
最后,至少值得一提的是您可以用来检查字段是否存在的Object.hasOwnProperty
方法。 重写上面的示例:
var myField = obj.myField;
if (myField.hasOwnProperty('mySetting') && myField.mySetting === true) {
/* do stuff */
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.