2015-06-26 77 views
0

我有以下代碼:如何解決編程something.something

;(function($){ 

    var getWeatherInfo = function(url, requiredKeys) { 

     var info = {}, 
      dfd = $.Deferred(); 

     $.getJSON(url, function(data) { 
      for(var i = 0; i < requiredKeys.length; i++) { 
       info[requiredKeys[i]] = data[requiredKeys[i]]; 
      } 

      dfd.resolve(info); 
     }); 

     return dfd.promise(); 
    }; 

var url = 'http://api.openweathermap.org/data/2.5/weather?q=London,uk', 
    requiredData = [ 
        'name', 
        'coord.lat', 
        'coord.lon', 
        'description' 
        ]; 
getWeatherInfo(url,requiredData).done(function(data){console.log(data)}); 

數據輸出爲:

Object {name: "London", coord.lat: undefined, coord.lon: undefined, description: undefined} 

Name工作正常,因爲它不具備.我怎樣才能解決休息?我不想使用eval。有沒有更好的選擇?

+1

如果你不打算使用'的eval()',你將需要打破串入它的棋子在'.'這樣你就可以單獨引用每件。 – jfriend00

+1

刪除字符串的'coord.'部分,或用'-'替換'.'? – guest271314

+0

@ jfriend00這使得真的很混亂。你可以在這裏找到其他的選擇嗎? –

回答

1

這將工作:

$.getJSON(url, function(data) { 
      for(var i = 0; i < requiredKeys.length; i++) { 
       if (requiredKeys[i].indexOf('.') > -1){ 
        var ar = requiredKeys[i].split("\."); 
        info[requiredKeys[i]] = data[ar[0]][ar[1]] 
       } 
       else{ 
        info[requiredKeys[i]] = data[requiredKeys[i]]; 
       } 
      } 

      dfd.resolve(info); 
     }); 

結果:對象{名: 「倫敦」,coord.lat:51.51,coord.lon:-0.13,說明:未定義}

http://jsfiddle.net/gpzd9w43/

編輯:

也許更優雅的方式來做到這一點,如果你有超過1個點:

$.getJSON(url, function(data) { 
     for(var i = 0; i < requiredKeys.length; i++) { 
      var ar = requiredKeys[i].split("\."); 
      var node = data; 

      for (var j = 0; j < ar.length; j++){ 
       node = node[ar[j]]; 
      } 

      info[requiredKeys[i]] = node; 
     } 

     dfd.resolve(info); 
    }); 

http://jsfiddle.net/gpzd9w43/1/