如何使用jQuery ajax检查json响应对象中的非零结果?

如何使用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...} 

当没有结果 -

[] 
+0

使用'results.length'应该可以。你是否尝试在控制台输出'response'来检查'response.allResults'等于什么? – jabclab

+0

我会看看通话返回的原始JSON。从你报告的结果来看,就像'array(“allResults”=> $ results)'返回'nil',而不是空数组,没有结果,这看起来很奇怪。 –

+0

刚查过日志,查看我的更新 –

尝试length,而不是大小..

+1

再次看看这个问题:他确实。 –

你的问题似乎是,虽然你在想的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您可以从查询中获取多个行。