1

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

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

if(bank != null ||
bank.customerlist != null ||
bank.customerlist.customer[0] != null ||
bank.customerlist.customer[0].address != null )
{

transactionAddress = bank.customerlist.customer[0].address;
}

这只是一个小例子,我不敢相信仅仅为了访问一个值就需要这么多的空检查。

有更好的解决方法吗?

4

2 回答 2

2

您可以使用 try catch 块:

try {
    var transactionAddress = bank.customerlist.customer[0].address;
} catch(e) {
    // handle the error here
}
于 2014-04-15T16:14:43.270 回答
1

您可以创建自己的访问器功能:

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;
}
于 2014-04-15T16:16:39.623 回答