0

次のような深い 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ますか? これができたとしても、複数のレイヤーで参照するにはどうすればよいですか?

4

1 に答える 1

0

6 つのリンクを含むページにリンクしている Bergi にプラス 1 を贈りました。

ドット表記の JavaScript 文字列をオブジェクト参照に変換する

これが完全な解決策です。

// We want to run a parse function to convert
// the object response.basicInfo.gender (which is 'M')
// to 'Male', etc.

// Sets the value of a string representing a deep object.
setDeep: function(root, path, value) {
  var parts = path.split('.'), obj = root;
  for (var i = 0; i < parts.length - 1; ++i) {
    obj = obj[parts[i]] || { };
  }
  obj[parts[parts.length - 1]] = value;
  return obj;
},

// Gets the value of a string representing a deep object.
getDeep: function(root, path) {
  var parts = path.split('.'), obj = root, target;
  for (var i = 0; i < parts.length; ++i) {
   target = obj[parts[i]];
   if (typeof target == "undefined") return void 0;
   obj = target;
  }
  return obj;
},

// Loops through multiple string representations
// of deep objects and runs the values through 
// assigned parsing functions for each of them,
// returning the root object.
parseHelper: function(obj, items) {
  for (item in items) {
    var val = getDeep(obj, item);
    var func = items[item];
    if (val !== undefined) {
      val = func(val);
    }
    setDeep(obj, item, val);
  }
  return obj;
},

// response.basicInfo.gender = 'M';
// response.foo.bar = true;

response = parseHelper(response, {
  'basicInfo.gender': function(val){
    return (val == 'M') ? 'Male' : (val == 'F') ? 'Female' : val;
  },
  'foo.bar': function(val) {
    return (val) ? false : true;
  },
});

// response.basicInfo.gender = 'Male';
// response.foo.bar = false;
于 2013-09-24T01:20:19.823 に答える