Как проверить наличие ненулевых результатов в объекте ответа json, используя jQuery ajax? - PullRequest
0 голосов
/ 02 декабря 2011

Мне просто нужно проверить, есть ли ненулевые результаты в моем объекте ответа, без необходимости запускать цикл ($ .each или что-то) и увеличивать счетчик (хотя я могу прервать подсчет после первой итерации) , Я думаю, я могу использовать $ .size () jQuery, который возвращает 1 и 0, если были результаты и не было результатов соответственно. Я искал в http://api.jquery.com/size/, но не нашел подтверждения. Есть идеи?

Вот мой простой код -

         $.ajax({
            type: "POST",
            data: postdata,
            async: false,
            url: posturl,
            dataType: "json",
            success: function(response)
            {
                var results = response.allResults;
                alert($(results).size()+" and "+results.length);

                //alerts "0 and 0" - when no results
                //alerts "1 and undefined" - when there are 1 or more results

            }
        });

В логике PHP бэкэнда -

//some array with key value pairs
$results = $this->_something($idsArray);
echo json_encode(array("allResults" => $results));

Обновление
Я уже пробовал использовать свойство length, и вы можете видеть в моем примере кода, что он оповещает undefined, когда есть ненулевые результаты.

Выход console.log(response.allResults);

При наличии ненулевых результатов -

Object { 109="add_offline_pack_test", 110="add_offline_pack_test1", 111="add_offline_pack_test2", more...}

Когда нет результатов -

[]

Ответы [ 4 ]

1 голос
/ 02 декабря 2011

Ваша проблема заключается в том, что, хотя вы думаете о allResults как о массиве, на самом деле это не так - это все еще объект пары ключ-значение - , за исключением случаев, когда он пуст!

Это происходит потому, что PHP json_encode рассматривает массив как «настоящий» массив только в том случае, если все ключи целые и непрерывные, начиная с нуля, или если массив пуст.В противном случае он обрабатывает массив как ассоциативный массив пар ключ-значение.

Следовательно, ваш тест может быть просто Существует ли свойство длины?

if (results.length === undefined) {
    // results is an object of key:value pairs
} else {
    // results is an array
    if (results.length) {
        throw "expected empty array isn't!";
    }
}

Как выПри использовании jQuery вы также можете использовать $.isArray() для проверки, получили ли вы (пустой) массив вместо объекта.

0 голосов
/ 02 декабря 2011

Просто используйте этот код:

$.ajax({
        type: "POST",
        data: postdata,
        async: false,
        url: posturl,
        dataType: "json",
    success: function (response) {
        if (response.d.results == undefined) {
           //do that
        }
        else {
           //do that
        }
    },
    error: function (response) {
        // do that
    }
});

Надеюсь, это поможет. С response.d.results.length Вы можете получить количество строк из запроса.

0 голосов
/ 02 декабря 2011

Поскольку $results является массивом пар ключ-значение (вместо просто значений), json_encode закодирует его в объект (поскольку объекты имеют пары ключ-значение), когда у вас есть результаты, но пустой массив, когда его нет (потому что $results - это массив).

Таким образом, когда результатов нет, результат, полученный из response.allResults, является пустым массивом (его длина равна 0). Когда есть результаты, вы получаете объект с этими результатами. Объекты не имеют элемента длины, поэтому он не определен.

Когда вы делаете $(obj), где obj - это какой-то объект (не массив), в результате получается такой объект:

{ 0: obj, length: 1 }

Когда вы делаете $(arr), где arr - некоторый массив, в результате получается такой объект:

{ length: arr.length, 0: arr[0], 1: arr[1], etc. }

Поскольку ваш результат является пустым массивом при отсутствии результатов, объект, возвращаемый $(result), будет выглядеть так:

{ length: 0 }

Так что, если у вас есть результаты, длина $(result) будет равна 1 (потому что ему был дан объект), а если у вас нет результатов, это будет 0 (потому что ему был дан пустой массив). $.size просто возвращает $.length, как указано на странице документа, на которую вы ссылались.

0 голосов
/ 02 декабря 2011

Попробуйте length вместо размера ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...