JavaScript,一种检查嵌套对象属性是否为null/undefined的优雅方式
JavaScript, elegant way to check nested object properties for null/undefined
一个"问题",我有一个对象,例如user = {}
,并通过使用应用程序的过程中,这得到填充。让我们在某个地方,在AJAX调用或其他事情之后我这样做:
user.loc = {
lat: 50,
long: 9
}
在另一个地方,我想检查user.loc.lat
是否存在。
if (user.loc.lat) {
// do something
}
如果不存在,将导致错误。如果user.loc.lat
是undefined
, user.loc
当然也是undefined
。
"Cannot read property 'lat' of null" - Dev Tools error
这意味着我需要像这样检查:
if (user.loc) {
if (user.loc.lat) {
// do something
}
}
或
if (user.loc && user.loc.lat) {
// do something
}
这不是很漂亮,我的对象越大,情况就越糟糕——很明显(想象一下10层嵌套)。如果user.loc
是undefined
,那么if(user.loc.lat)
不只是返回false
,这有点让我恼火。
检查这种情况的理想方法是什么?
您可以像这样使用一个实用程序函数:
get = function(obj, key) {
return key.split(".").reduce(function(o, x) {
return (typeof o == "undefined" || o === null) ? o : o[x];
}, obj);
}
用法:
get(user, 'loc.lat') // 50
get(user, 'loc.foo.bar') // undefined
或者,只检查一个属性是否存在,而不获取它的值:
has = function(obj, key) {
return key.split(".").every(function(x) {
if(typeof obj != "object" || obj === null || ! x in obj)
return false;
obj = obj[x];
return true;
});
}
if(has(user, 'loc.lat')) ...
您可以使用lazy and
:
if(user.loc && user.loc.lat) { ...
或者,您使用CoffeeScript。ES2020有新的语法(Nullish coalescing Operator)。
user.loc?.lat?. '...'
将运行loc
属性检查和防止空对象
javascript有try-catch。这取决于你实际需要做什么(即你的else
语句看起来像什么,如果它是undefined
),这可能是你想要的。
的例子:
try {
user.loc.lat.doSomething();
} catch(error) {
//report
}
试试这个if(user && user.loc && user.loc.lat) {...}
可以使用typeof
检查null和undefined的值如果.loc
的值为false
,则可以尝试
if(user && user.loc && typeof(user.loc)!=="undefined"){...}
如果你有一个巨大的嵌套对象,请查看
。
function checkNested(obj /*, level1, level2, ... levelN*/) {
var args = Array.prototype.slice.call(arguments),
obj = args.shift();
for (var i = 0; i < args.length; i++) {
if (!obj.hasOwnProperty(args[i])) {
return false;
}
obj = obj[args[i]];
}
return true;
}
var test = {level1:{level2:{level3:'level3'}} };
checkNested(test, 'level1', 'level2', 'level3'); // true
checkNested(test, 'level1', 'level2', 'foo'); // false
更新:尝试lodash.get
相关文章:
- 是否可以 document.getElementsByTagName('head')[0] ever 返回 null
- 验证对象是否为null Javascript/Angularjs
- 如何在JavaScript中检查变量是否为null和/或未定义
- 找出套接字是否等于null
- 有没有一种方法可以判断图像src是否在javascript内部返回null
- Regex以确定该值在JS中是否有效,返回null
- 如何在javascript中检查session是否为null
- 在javascript中测试变量是否为null,而不会导致未定义的错误
- 检查 JS 变量是否不为 null 和 true
- JavaScript - 检查数组中的所有值是否都不是 Null - 数组 / 每个 /
- 如何确定对象中的任何值是否为非 null
- 在JavasScript中是否有任何时间当“!value ?null : value[0]“ 不等同于 ”value ?
- 这是检查变量是否被定义的最佳方法,而不是 null 并等于 “” 或其他任何内容
- 检查函数是否返回 null
- 如何检查对象是否为null
- 检查是否为null时出现JS类型错误
- 我如何检查一个变量是否不是null,也不是数字
- 检查ViewBag值是否为null
- 在javascript中,null是否占用内存
- 测试null是否无效