Null检查Javascript中的大型分层对象
我们在javascript中有一个大的层次对象(最糟糕的遗留设计)。我面临的问题是,每当我想访问对象结构中的某个元素时,都需要执行一系列空检查 假设我有一个包含客户列表的银行对象,我想得到第一个客户的地址Null检查Javascript中的大型分层对象,javascript,object,null-check,Javascript,Object,Null Check,我们在javascript中有一个大的层次对象(最糟糕的遗留设计)。我面临的问题是,每当我想访问对象结构中的某个元素时,都需要执行一系列空检查 假设我有一个包含客户列表的银行对象,我想得到第一个客户的地址 if(bank != null || bank.customerlist != null || bank.customerlist.customer[0] != null || bank.customerlist.customer[0].address != null ) { transac
if(bank != null ||
bank.customerlist != null ||
bank.customerlist.customer[0] != null ||
bank.customerlist.customer[0].address != null )
{
transactionAddress = bank.customerlist.customer[0].address;
}
这只是一个小例子,我不敢相信需要这么多空检查
只需访问一个值
是否有更好的解决方法?您可以使用try catch block:
try {
var transactionAddress = bank.customerlist.customer[0].address;
} catch(e) {
// handle the error here
}
您可以创建自己的访问器函数:
function access(obj, path) {
var arr = path.split('/');
while(obj && arr.length)
obj = obj[arr.shift()];
return obj;
}
然后像这样使用它:
var bank = {
customerlist: {customer: [{address: 'foo'}]}
}
access(bank, 'customerlist/customer/0/address'); // 'foo'
access(bank, 'bar/foo/foobar'); // undefined (no error)
也可考虑使用…
function access(obj, path) {
var arr = path.split('/');
while(obj!=null && arr.length)
obj = obj[arr.shift()];
return obj;
}
…如果您希望对非对象使用access
,例如,您希望access(“”,'length')
返回0
解释,
function access(obj, path) {
var arr = path.split('/');
while (
obj /* To avoid `null` and `undefined`. Also consider `obj != null` */
&& /* Logical AND */
arr.length /* Check that `arr` still has elements */
) {
obj = obj[arr.shift()]; /* `arr.shift()` extracts the first
element is `arr` */
}
return obj;
}
把它封装在
try{…}catch(e){…}
这个问题似乎是重复的。我在这里的回答和在另一个线程中的几乎相同;我没有抄袭他,强悍。这看起来是个不错的选择,我对javascript有点陌生,你能告诉我在这种while条件下到底做了什么吗:while(obj&&void 0!=(prop=arr.shift())?@DntFrgtDSemiCln它检查obj
是否真实(以避免null
和未定义的),它将arr
的第一个元素提取到prop
,并检查prop
是否为undefined
(我使用void 0
,因为undefined
可能已被修改)。非常感谢您的解释@Oriol,你认为try-catch块也会有帮助吗?@DntFrgtDSemiCln我简化了我的代码(因为我不知道尝试shift()
或检查length
,我使用的是最简单的)@DntFrgtDSemiCln是的,try-catch
也可以工作,但我发现它很难看:)还要注意,如果在try catch
中抛出错误,则会有一点性能损失。不过,不知道这是否比调用函数的惩罚更糟糕。