成功的getJSON操作后,data.length未定义

时间:2012-02-24 09:18:43

标签: jquery json each

我正在使用getJSON中的JSON数据填充下拉列表。

填充工作正常,但尝试通过与data.length进行比较来确定它已完成,因为data.lengthundefined,我无法理解为什么!

数据如下:

{
    "1": {
        "id": "1",
        "name": "Plymouth"
    },
    "2": {
        "id": "2",
        "name": "Torquay"
    }
}

我的代码如下:

$('.locationList').empty();
$('.locationList').append('<option value="">Select...</option>');
$.getJSON('/Settings/locations.txt', function (data) {
    var dataNum = data.length;
    var counter = 1;
    $.each(data, function (i, item) {
        $('.locationList').append('<option value="' + data[i].id + '">' + data[i].name + '</option>');
        if (counter >= dataNum) {
            $('#bookTo').val(locationID + 1);
            $('#transferFrom').val(locationID);
        };
        counter++;
    });
});

本节:

if (counter >= dataNum) {
    $('#bookTo').val(locationID + 1);
    $('#transferFrom').val(locationID);
};
counter++;

允许我在$.each循环完成后预设下拉框的值(这适用于其他列表),但它没有发生。

当我运行alert(data.length)时,我得到undefined这没有任何意义,因为data显然有一个length,以便它正确填充下拉框$.each,它确实如此!

编辑:抱歉,应该添加,变量locationID在前面的Cookie中声明并且IS有效

4 个答案:

答案 0 :(得分:4)

这是一个对象:

data = {
    "1": {
        "id": "1",
        "name": "Plymouth"
    },
    "2": {
        "id": "2",
        "name": "Torquay"
    }
}

并且它没有length属性。

请参阅:仅属性12

您确定要将它作为对象评估者,然后是数组:

data = [
    {
        "id": "1",
        "name": "Plymouth"
    },
    {
        "id": "2",
        "name": "Torquay"
    }
]

然后你有length属性和许多其他本机数组方法,如sort。您可以像这样访问您的数据:

data[0]
女巫等于:

{
    "id": "1",
    "name": "Plymouth"
}

答案 1 :(得分:3)

可能不是这样做的最佳方式,但这样的事情可能是一个快速解决方法吗?

$('.locationList').empty();
$('.locationList').append('<option value="">Select...</option>');
$.getJSON('/Settings/locations.txt', function (data) {
    var dataNum = 0;
    for (i in data) {if (data.hasOwnProperty(i)) {dataNum++;}}    
    var counter = 1;
    $.each(data, function (i, item) {
        $('.locationList').append('<option value="' + data[i].id + '">' + data[i].name + '</option>');
        if (counter >= dataNum) {
            $('#bookTo').val(locationID + 1);
            $('#transferFrom').val(locationID);
        };
        counter++;
    });
});

答案 2 :(得分:1)

你的JSON:

{"1":{"id":"1","name":"Plymouth"},"2":{"id":"2","name":"Torquay"}}

是一个对象,而不是一个数组,因此未定义length属性。 如果要将其解析为数组,则服务器需要提供如下响应:

{"response": [{"1":{"id":"1","name":"Plymouth"}},
{"2":{"id":"2","name":"Torquay"}}] }

使用[]代替{}

答案 3 :(得分:0)

当response.data == []时, 这有效:

if (response.data.length === 0)

这是一个数组然后有长度prospriety。