Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Null检查Javascript中的大型分层对象_Javascript_Object_Null Check - Fatal编程技术网

Null检查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

我们在javascript中有一个大的层次对象(最糟糕的遗留设计)。我面临的问题是,每当我想访问对象结构中的某个元素时,都需要执行一系列空检查

假设我有一个包含客户列表的银行对象,我想得到第一个客户的地址

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
中抛出错误,则会有一点性能损失。不过,不知道这是否比调用函数的惩罚更糟糕。