0

我向我的服务器发送 http 请求(使用 ajax),它返回 json 字符串,例如:

{

    "neighbors":{
        "data":[
            {
                "id":"7f40cb24-603e-4943-9a0b-e16e024c8bd5",
                "name":"jeff ferry",
                "picture":"url",
                "location":{
                    "data":[
                        {
                            "latitude":"xxx",
                            "longitude":"yyy"
                        }
                    ]
                }
            }
        ]
    }
}

并在 html 页面 ajax 回调中访问数据,例如:

success: function (data) {

    var outerObj = data.neighbor.data;    
    var res = ""; 

    for (i in outerObj )          
    {
    if (outerObj .hasOwnProperty(i)) {
        // my outer stuff              
            var innerObj = outerObj.data;
            for (j in innerObj)          
            {
            // my inner stuff
                if (innerObj.hasOwnProperty(j)) {
                }
            }
        }                                            
    }
}

但我想知道我是否可以通过某种优化(更短)的方式访问它?

任何可观的帮助

4

4 回答 4

3

也许您可以收紧从服务器返回的数据结构?由于 1) location 属性实际上只是一个 lat/long 元组,并且 2) 内部data数组周围的对象只是一个冗余包装器,这样怎么样:

{
    "neighbors":[
        {
            "id":"7f40cb24-603e-4943-9a0b-e16e024c8bd5",
            "name":"jeff ferry",
            "picture":"url",
            "location":["xxx","yyy"]
        }
    ]
}

这样,你的 JavaScript 就变成了这样:

success: function (data) {

    var res = ""; // what was this for, anyway?

    for (var n in data.neighbors) if (data.neighbors.hasOwnProperty(n) {
        var neighbor = data.neighbors[n];
        // actions on the neighbor object here

        var location = neighbor.location;
        // actions on the location here
    }
}
于 2012-11-29T08:29:07.840 回答
2

如果你更喜欢使用 jQuery

var data
$.getJSON(thejsonfile, function(e) {
   data = e.neighbors.data[0]
})

现在“邻居”中的所有数据都在数据中,您可以使用“数据”引用它们

所以想得到 id 以这种方式引用它var id = data.id

注意:这些方括号中的任何内容都[]指一个循环,如果“邻居”列表中有一个或多个数据,则必须使用循环$.map() or $.each()

于 2012-11-29T08:29:45.400 回答
1

假设您只关心内部属性,我会将其包装在 try-catch 块中。

var outer, inner;
try {
    outer = data.neighbors.data[0];
    inner = outer.location.data[0];
    delete outer.location;
} catch (e) {
    // no good
}

即,像这样

{"id":"7f40cb24-603e-4943-9a0b-e16e024c8bd5","name":"杰夫渡轮","图片":"url"}

{"纬度":"xxx","经度":"yyy"}

于 2012-11-29T08:21:13.807 回答
1

neighbours.data是一个数组。如果您希望遍历它们,则使用 for 循环而不是 foreach。

var i = 0,
    outerLength = (neighbours.data && neighbours.data.length) || 0,
    innerLength, j,
    outerObj, innerObj;

for (; i < length; i++) {
    outerObj = neighbours.data[i];

    j = 0;
    innerLength = (outerObj.data && outerObj.data.length) || 0;

    for (; j < innerLength; j++) {

        innerObj = outerObj.data[j];
        // do what you wish! 
    }

}
于 2012-11-29T08:28:48.233 回答