2012-11-15 145 views
0

閱讀了很多Stackoverflow問題,博客和文檔後,我仍然無法弄清楚爲什麼對任何數組的此特定迭代不起作用。Javascript Array對象屬性迭代

我正在使用jQuery和JavaScript(顯然)拉,然後通過結果對象的屬性拉取所需的鍵/值對。因爲我發現那些我想插入到另一個數組對象中的對。

:如我所料但是當我試圖去在新創建的對象沒有任何反應,如果我試圖找到它的長度則返回0

的長度這是我拉的記錄,創建對象

_recordsFromGeoJSON: function(inputText) { 
    var retRecords = {}, 

    $.getJSON(this.GeoJSONUrl, function(data) { 
     var geoJSONdata = data; 

     $.each(geoJSONdata.features, function(fkey, fvalue) { 
      $.each(fvalue.properties, function(pkey, pvalue) { 
       var re = new RegExp(inputText, "i"); 
       var retest = re.test(pvalue); 
       if (retest) { 
        retRecords[pvalue] = fvalue.geometry.coordinates; 
        return; 
       } 
      }); 
     }); 
    }); 
    return retRecords; 
}, 

這是對新的對象爲互爲作用的代碼:

for(var key in this._retRecords) { 
     //this function will never run 
     var always = foo(bar); 
    } 

一些樣本以GeoJSON:

{ 
"type": "FeatureCollection",                   
"features": [ 
{ "type": "Feature", "id": 0, "properties": { "NAME": "14 PARK PLACE PH 4", "AREAID":  3.0, "STR12M": 0.0, "CLS12M": 6.0, "STR4M": 0.0, "CLS4M": 0.0, "TOTAL": 164.0, "OCC": 112.0, "NFU": 0.0, "UNC": 3.0, "DVL": 49.0, "UDVL": 0.0 }, "geometry": { "type": "Point", "coordinates": [ -93.27512816536759, 37.044305883435001 ] } } 
, 
{ "type": "Feature", "id": 1, "properties": { "NAME": "ALPHA MEADOWS NORTH", "AREAID": 8.0, "STR12M": 0.0, "CLS12M": 0.0, "STR4M": 0.0, "CLS4M": 0.0, "TOTAL": 12.0, "OCC": 0.0, "NFU": 0.0, "UNC": 0.0, "DVL": 0.0, "UDVL": 0.0 }, "geometry": { "type": "Point", "coordinates": [ -92.839131163095786, 37.119205483765143 ] } } 
] 
} 

當我console.log(this._retRecords); Chrome的報告顯示了我從數據集中所有預期的屬性的對象:

Object 
    14 PARK PLACE PH 4: Array[2] 
     0: -93.27512816536759 
     1: 37.044305883435 
     length: 2 
     __proto__: Array[0] 
    ALPHA MEADOWS NORTH: Array[2] 
     0: -92.839131163095786 
     1: 37.119205483765143 
     length: 2 
     __proto__: Array[0] 

使用這個question報告0長度給出兩種方法。

我很肯定我缺少一些基本的東西,但我找不到它是什麼。任何幫助,批評,替代方法都會很棒!

+2

您正在返回一個空對象...此刻執行'retRecords;'執行,Ajax請求尚未完成,並且沒有數據添加到對象。 –

+1

[無法從jQuery Ajax調用獲取正確的返回值]的可能重複(http://stackoverflow.com/questions/3537434/cant-get-correct-return-value-from-an-jquery-ajax-call ) –

+0

@FelixKling其實它更糟。不僅對象是空的,而且在稍後的某個點也會被修改。 –

回答

1

看來,你不明白你的getJSON()函數立即啓動(例如發送請求),然後在getJSON函數完成工作之前很久返回。它的工作將在稍後調用完成功能時完成。因此retRecords_recordsFromGeoJSON()函數返回時尚未填充。

這是異步編程。 getJSON的完成函數會在_recordsFromGeoJSON()返回後很久被調用。因此,你不能像同步串行編程那樣對待它。

取而代之,retRecords只在完成函數中或在將該數據傳遞給該完成函數並從該函數調用的任何函數中已知。這就是異步編程在javascript中的工作原理。您必須啓動所有進一步處理完成功能的結果getJSON()。而且,您不能從_recordsFromGeoJSON()返回結果,因爲結果在該函數返回時尚未知道。這是一種不同的編碼方式,它有點痛苦,但它是你如何處理javascript中的異步操作。

+1

請注意「完成」和「返回」之間的區別。 getJSON()快速返回,但還沒有完成;-) –

+0

優秀的傢伙。感謝大家的幫助。一旦我解決了我的新手錯誤,我的第一個真正的JavaScript項目變成了成功。謝謝! – RomaH