[英]How to check if object within object exists
似乎以下用于检查 object 成员是否存在的技术会产生错误,因为在检查之前尚未声明“bar”父 object,这意味着我必须在检查之前声明它或使用两个“typeof”表达式,其中任何一个都是多余的代码:
var foo = {},
newVal = (typeof foo.bar.myVal !== 'undefined' ? foo.bar.myVal : null );
Error: foo.bar is undefined
那么,如何检查未声明的 object 中的成员是否存在而不产生错误?
我喜欢 javascript,但有时......
只需使用以下代码即可完成:
var newVal = (foo && foo.bar && typeof foo.bar.myVal !== 'undefined') ? foo.bar.myVal : foo.bar.myVal
一个属性是 null 或未定义,它将被评估为 false,因此上述代码将只处理第一个“false”语句。
var newVal = ('foo' in window && // could be typeof foo !== 'undefined' if you want all scopes
'bar' in foo &&
'myVal' in foo.bar) ? foo.bar.myVal : null;
公平地说,javascript 读起来几乎像自然语言。
最简单的测试是:
if (foo && foo.bar) {
// play with foo.bar.myVal ...
}
正如Matthew Abbott在他的回复中给出的那样,如果您对子属性进行了大量深入研究,其中整个 object 或沿链的某个位置可以是 null,您可以编写一个方法供以后使用。 下面是我使用lodash的实现。
checkGraph(obj, graphPath) {
if (obj) {
let root = obj;
_.each(graphPath.split('.'), part => {
if (root[part]) {
root = root[part];
} else {
return false; // bad property
}
});
return true;
}
return false; // bad object
}
您可以像这样调用该方法:
if (this.checkGraph(object, 'property.subproperty') {
// do thing
}
你可以把它包装成一个方法:
function checkGraph(obj, graphPath)
{
var parts = graphPath.split(".");
var root = obj;
for (var i = 0; i < parts.length; i++)
{
var part = parts[i];
if (root[part] && root.hasOwnProperty(part))
root = root[part];
else
return false;
}
return true;
}
您可以将其称为:
var foo = {},
newVal = checkGraph(foo, "bar.myVal") ? foo.bar.myVal : null;
还有另一种方法是使用像Babel这样的JS 转译器:
if (foo?.bar) {
// play with foo.bar.myVal ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.