data.length не определена после успешной операции getJSON - PullRequest
3 голосов
/ 24 февраля 2012

Я заполняю раскрывающийся список данными JSON из getJSON.

Заполнение работает нормально, но я пытаюсь установить, что оно завершено, сравнивая с data.length, не работает, так как data.length равно undefined и я не понимаю почему!

Данные выглядят так:

{
    "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 и является действительной

Ответы [ 4 ]

4 голосов
/ 24 февраля 2012

Это объект:

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

и у него нет свойства length.

см .: только собственность 1 и 2.

Вы уверены, что хотите, чтобы он был объектом оценки, а не массивом:

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

, тогда у вас есть свойство length и множество других собственных методов массива, таких как sort. И вы можете получить доступ к своим данным, как это:

data[0]

Ведьма невероятно похож на:

{
    "id": "1",
    "name": "Plymouth"
}
3 голосов
/ 24 февраля 2012

Возможно, это не лучший способ сделать это, но что-то вроде этого может быть быстрым решением?

$('.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++;
    });
});
1 голос
/ 24 февраля 2012

Ваш JSON:

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

является объектом, а не массивом, поэтому свойство length не определено.Если вы хотите проанализировать его как массив, ваш сервер должен дать ответ вроде:

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

с [] вместо {}

0 голосов
/ 09 сентября 2017

Когда response.data == [], это работает:

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

Это массив, тогда он имеет длину длины.

...