如何使用jQuery ajax检查json响应对象中的非零结果?
我只需要检查我的响应对象中是否有一些非零结果,而不必运行循环($ .each或其他)并增加一个计数器(尽管在第一次迭代后我可以中断计数)。我想我可以使用jQuery的$ .size(),如果有结果并且没有结果,则返回1和0。我在http://api.jquery.com/size/搜索,但没有找到确认。有任何想法吗 ?如何使用jQuery ajax检查json响应对象中的非零结果?
这里是我的简单的代码 -
$.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...}
当没有结果 -
[]
尝试length
,而不是大小..
再次看看这个问题:他确实。 –
你的问题似乎是,虽然你在想的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()
测试您是否已经收到一个(空的)数组,而不是一个对象。
由于$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
,如链接到的文档页所述。
简单使用此代码:
$.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您可以从查询中获取多个行。
使用'results.length'应该可以。你是否尝试在控制台输出'response'来检查'response.allResults'等于什么? – jabclab
我会看看通话返回的原始JSON。从你报告的结果来看,就像'array(“allResults”=> $ results)'返回'nil',而不是空数组,没有结果,这看起来很奇怪。 –
刚查过日志,查看我的更新 –