次のような深い Javascript オブジェクトを参照する文字列があるとします。
var string = 'response.basicInfo.gender';
.
文字列をs で分割してオブジェクトを構築し、各レベルをチェックし、オブジェクトが実際に存在する場合はその値を処理することにより、そのオブジェクトが存在するかどうかを安全にチェックする関数を構築したいと考えています。
var parseHelper = function(response, items) {
for (item in items) {
var parts = String(item).split('.');
for (var i = 0; i < parts.length; ++i) {
// ... etc. build the string
}
}
}
parseHelper(response, {
'basicInfo.gender': function(val){
return (val == 'M') ? 'Male' : (val == 'F') ? 'Female' : val;
},
})
上記の関数は不完全ですが、これを使用して文字列を作成し、それぞれが存在するかどうかを確認するとします。
// so let's suppose we build the string:
var builtString = "response['basicInfo']";
// Now we want to check if it exists
if (response['basicInfo']) {
// And if we are fine that it exists, go on to the next item
var builtString = "response['basicInfo']['gender']";
// etc.
}
その関数の作成に問題はありません。文字列を評価"response['basicInfo']['gender']"
してオブジェクトへの実際の参照に変換する方法がわかりません。私の唯一の推測は eval() ですが、eval は悪です...
アップデート
に行くことでグローバルオブジェクトを参照できることは知っていますが、参照しwindow['blah']
たいこの応答オブジェクトはグローバルスコープにないので、使用しthis
ますか? これができたとしても、複数のレイヤーで参照するにはどうすればよいですか?