属性的Javascript数组对象迭代

属性的Javascript数组对象迭代,javascript,jquery,json,Javascript,Jquery,Json,在阅读了许多Stackoverflow问题、博客和文档之后,我仍然无法理解为什么在任何数组上的特定迭代都不起作用 我使用jQuery和javascript(显然)来提取一个对象,然后检查结果对象的属性以提取所需的键/值对。当我找到这些对时,我想插入到另一个数组对象中。该对象是按我预期的那样创建的,但是当我尝试遍历新创建的对象时,什么也没有发生,如果我尝试查找其长度,它将返回0的长度 这是我提取记录的地方: _recordsFromGeoJSON: function(inputText) {

在阅读了许多Stackoverflow问题、博客和文档之后,我仍然无法理解为什么在任何数组上的特定迭代都不起作用

我使用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时(这个.\u记录)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]
使用此报告中给出的两种方法,长度为0


我很确定我遗漏了一些基本的东西,但我找不到它是什么。任何帮助、批评、替代方法都将是伟大的

您似乎不明白您的
getJSON()
函数会立即启动(例如发送请求),然后在getJSON函数完成其工作之前立即返回。它的工作将在稍后调用completion函数时完成。因此,当
\u recordsFromGeoJSON()
函数返回时,
retRecords
尚未填充

这是异步编程。getJSON的completion函数将在
\u recordsFromGeoJSON()
返回很久之后调用。因此,您不能将其视为同步、串行编程


相反,
retRecords
仅在完成函数中或在向该完成函数传递数据并从中调用的任何函数中已知。这就是异步编程在javascript中的工作方式。必须从completion函数启动对
getJSON()
结果的所有进一步处理。而且,您不能从
\u recordsFromGeoJSON()
返回结果,因为当该函数返回时,还不知道结果。这是一种不同的编码方式,有点痛苦,但这是在javascript中处理异步操作的方式。

您返回的是一个空对象。。。此时
返回记录已执行,Ajax请求尚未完成,并且没有向对象添加任何数据。可能与@FelixKling重复实际上更糟糕。对象不仅是空的,以后也会被修改。@Jan:是的,但我不想让它更混乱;)请注意“完成”和“返回”之间的区别
getJSON()
返回速度很快,但还没有完成;-)好家伙。谢谢大家的帮助。我的第一个真正的javascript项目在我克服了新手错误后就成功了。谢谢