Javascript Array Object属性的迭代

时间:2012-11-15 04:12:17

标签: javascript jquery json

在阅读了许多Stackoverflow问题,博客和文档之后,我仍然无法弄清楚为什么任何数组上的特定迭代都无效。

我正在使用jQuery和javascript(显然)来提取GeoJSON file,然后遍历生成的对象的属性以拉出所需的键/值对。当我发现那些我想要插入另一个数组对象的对时。该对象是按照我的预期创建的,但是当我尝试遍历新创建的对象时,没有任何反应,如果我尝试找到它的长度,则返回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报告上给出的两种方法长度为

我很确定我错过了一些基本的东西,但我找不到它是什么。任何帮助,批评,替代方法都会很棒!

1 个答案:

答案 0 :(得分:1)

您似乎不明白您的getJSON()函数会立即启动(例如发送请求),然后在getJSON函数完成工作之前很久就会返回。它的工作将在调用完成函数后的某个时间完成。因此,当retRecords函数返回时,_recordsFromGeoJSON()尚未填充。

这是异步编程。 getJSON的完成函数将在_recordsFromGeoJSON()返回很久之后的某个时间调用。因此,您不能将其视为同步串行编程。

相反,retRecords仅在完成函数或将数据传递给该完成函数并从该函数调用的任何函数中已知。这就是异步编程在javascript中的工作方式。您必须从完成功能启动getJSON()结果的所有进一步处理。并且,您无法从_recordsFromGeoJSON()返回结果,因为该函数返回时结果尚不可知。这是一种不同的编码方式,有点痛苦,但是你必须在javascript中处理异步操作。