4

重複の可能性:
ネストされたオブジェクト キーの存在を確認する 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; 
        },

を判別できないというエラーが表示され[fieldName]ますundefined object this.model.errors[formsetName]。つまり、最初にthis.model.errors[formsetName]が空かどうかを判断し、次にis かどうかをテストする必要[fieldname]がありundefinedます。

これは本当に面倒な解決策のようです。これを変更するための提案はありますか?

4

2 に答える 2

6

プロパティ名をパラメーターとして取り、存在する場合は最終値を返すライブラリ関数を作成できます。

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

次のように呼び出します。

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

フィールドが見つからない場合のundefined代わりに戻りたい場合は、関数を少し変更できます。null

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;
    }
}

http://jsfiddle.net/HbggQ/

于 2012-06-06T17:36:55.420 に答える
3

Paul が示唆したように、これは Javascript 固有の制限です。Coffeescript (これは JS 上のシンタックス シュガーの層にすぎません) でさえ、実際には問題を解決しません。シンタックス シュガーの下に回避策を隠しているだけです (これは確かに非常に便利です)。

Javascript に固執する場合、基本的に 2 つのオプションがあります。三項演算子を使用するか、ブール演算子を使用します。ABCD をチェックするそれぞれの例を次に示します (A、B、C、または D が存在しない可能性があります)。

// Returns A.B.C.D, if it exists; otherwise returns false (via ternary)
return !A ? false :
            !A.B ? false :
                   !A.B.C ? false :
                            A.B.C.D ? A.B.C.D : false;

// Returns A.B.C.D, if it exists; otherwise returns false (via booleans)
return A && A.B && A.B.C && A.B.C.D;

明らかに後者の方がずっと短いです。両方のソリューションは、Javascript の「真実性」 (つまり、値0""null、およびundefinedが false としてカウントされること) に依存しています。これらの値にはエラー プロパティがないため、これは問題ありません。0ただし、(たとえば)とを区別する必要がある場合はundefined、三項スタイルを使用して、 に置き換えることができ!Aますtypeof(A) == 'undefined'

于 2012-06-06T17:41:17.233 に答える