2

多くの場合、リモート API 呼び出しからの応答で、ネストされたオブジェクトを受け取ります。

var response = {
    data : {
        users : [
            {
                name : 'Mr. White'
            }
        ]
    }
}

最初のユーザーの名前が「Mr. ホワイト」、そして当然のように何かを書きたいと思うでしょう。

var existed = response.data.users[0].name === 'Mr. White'

ただし、すべてのオブジェクトが存在するかどうかはわかりません。そのため、代わりに例外を回避するために、次のように記述します。

var existed = response && response.data && response.data.users && response.data.users[0].name === 'Mr. White'

これを行うより良い方法はありますか?頭に浮かぶ別の醜いオプションは次のとおりです。

var existed = false;
try {
    var existed = response.data.users[0].name === 'Mr. White';
} catch(e) { }

バニラの JavaScript に加えて、通常は underscore.js と jquery も利用できます。

編集:

おっと、ネストされたオブジェクト key の存在について、javascript テストの複製を要求したことに気付きました。

これらの回答に基づく興味深いオプションは次のとおりです。

var existed = (((response || {}).data || {}).users || [{}])[0].name === 'Mr. White';
4

4 に答える 4

1

これは、私のプロジェクトの1つで使用した関数ですhttp://jsfiddle.net/JBBAJ/

var object = {
    data: {
        users: [
            {
                firstName: "White"
            },
            {
                firstName: "Black"
            }
        ]
    }
}
var read = function(path, obj) {
    var path = path.split(".");
    var item = path.shift();
    if(item.indexOf("]") == item.length-1) {
        // array
        item = item.split("[");
        var arrayName = item.shift();
        var arrayIndex = parseInt(item.shift().replace("]", ""));
        var arr = obj[arrayName || ""];
        if(arr && arr[arrayIndex]) {
            return read(path.join("."), arr[arrayIndex]);
        } else {
            return null;
        }
    } else {
        // object
        if(obj[item]) {
            if(path.length === 0) {
                return obj[item];
            } else {
                return read(path.join("."), obj[item]);
            }
        } else {
            return null;
        }
    }

}
console.log(read("data.users[0].firstName", object)); // White
console.log(read("data.users[1].firstName", object)); // Black
console.log(read("data.test.users[0]", object)); // null

アイデアは、パスをオブジェクトとともに文字列として渡すことです。アイデアは、パスが間違っているため、例外のスローを防ぎ、null だけを受け取ることでした。良い点は、関数がすべてのパスで機​​能し、長い if ステートメントを記述する必要がないことです。

于 2013-09-05T11:06:16.157 に答える
1

私は try catch アプローチを使用しますが、醜さを隠すためにそれを関数にラップします。

于 2013-09-05T10:51:20.080 に答える