2012-11-15 95 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