在Javascript中测试嵌套对象未定义

ben*_*nto 4 javascript properties object

可能重复:
javascript测试是否存在嵌套对象键

我试图构建一个错误消息formset通过测试,如果某个对象是没有 undefined的,如果它不是undefined,那么我结束了该错误信息填充它.主要的问题是我必须验证每个嵌套对象是否是undefined,这导致一些相当丑陋的代码.这是一个例子:

errorsForField: function(fieldName, formsetName, formNumber) {
            if (typeof this.model.errors != 'undefined'){

                var fieldError = document.createElement('span');
                $(fieldError).addClass('field-error');

                // THE FOLLOWING LINE THROWS ERROR.
                if (formsetName && _.isUndefined(this.model.errors[formsetName][fieldName]) != true) {
                    $(fieldError).text(this.model.errors[formsetname][fieldName]);
                } else if (typeof this.model.errors[fieldName] != "undefined"){
                    $(fieldError).text(this.model.errors[fieldName]);
                }

                this.errors[fieldName] = fieldError.outerHTML;
                return fieldError.outerHTML; 
            }
            return false; 
        },
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,指出我不能确定[fieldName]undefined object this.model.errors[formsetName].换句话说,我必须先确定是否this.model.errors[formsetName]为空,然后测试是否[fieldname]为空undefined.

这似乎是一个非常麻烦的解决方案.有任何改变这个的建议吗?

gil*_*ly3 6

您可以创建一个库函数,它将属性名称作为参数并返回最终值(如果存在),或者为null:

function TryGetPropertyValue(o, propertyName1 /*, ... propertyNameN */) {
    var names = [].slice.call(arguments, 1);
    while (o && names.length) {
        o = o[names.shift()];
    }
    return names.length ? null : o;
}
Run Code Online (Sandbox Code Playgroud)

称之为:

var err = TryGetPropertyValue(this.model.errors, formsetName, fieldName) ||
          TryGetPropertyValue(this.model.errors, fieldName);
if (err != null) {
    $(fieldError).text(err);
}
Run Code Online (Sandbox Code Playgroud)

如果您希望它返回undefinednull不是找不到该字段,您可以稍微更改该功能:

function TryGetPropertyValue(o, propertyName1 /*, ... propertyNameN */) {
    var names = [].slice.call(arguments, 1);
    while (o && names.length) {
        o = o[names.shift()];
    }
    if (names.length == 0) {
        return o;
    }
}
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/HbggQ/