jQuery Ajax Success获得返回的数组长度?

时间:2014-05-19 08:21:38

标签: javascript php jquery ajax arrays

我试图从PHP循环返回的数组。但jQuery .length正在给我:

'undefined'

PHP:

$items = array();
$items["country"] = "North Korea",
$items["fruits"] = array(
                      "apple"=>1.0,
                      "banana"=>1.2,
                      "cranberry"=>2.0,
                    );
echo json_encode( $fruits );

jQuery的:

$.ajax({
    url: "items.php",
    async: false,
    type: "POST",
    dataType: "JSON",
    data: { "command" : "getItems" }
}).success(function( response ) {
    alert( response.fruits.apple );
    alert( response.length );
});
  • 这里第一个警报()没问题,返回:"1.0"
  • 然后检测长度response.length的第二个警报()返回:
    • undefined

然后我怎么能循环这个数组(或)如何从jQuery结束循环Fruits(由PHP定义,如$items["fruits"])?

6 个答案:

答案 0 :(得分:14)

只需尝试这样的事情

要在任何与ES5兼容的环境中执行此操作,例如Node,Chrome,IE 9 +,FF 4+或Safari 5 +:

alert(Object.keys(response).length); 

你的代码

$.ajax({
    url: "items.php",
    async: false,
    type: "POST",
    dataType: "JSON",
    data: { "command" : "getItems" }
}).success(function( response ) {
    alert( response.fruits.apple );
    alert(Object.keys(response).length); 
});

参考

How to efficiently count the number of keys/properties of an object in JavaScript?

答案 1 :(得分:1)

看起来你正在PHP那边创建一个关联数组,它几乎以JavaScript中的object形式出现。对象上没有.length属性。

你可以"循环"通过在Object.keys旁边调用Array.prototype.forEach或直接使用for..in循环来覆盖对象键。

看起来像

Object.keys( response ).forEach(function( key ) {
    console.log('key name: ', key);
    console.log('value: ', response[key]);
});

答案 2 :(得分:0)

为此,您必须将对象转换为具有长度的对象,如下所示:

var length = Object.keys(response).length

请注意,这不是一个完整的解决方案,因为它在IE8中不起作用。

另一种解决方案是添加"计数"在PHP中使用JSON对象的索引,然后在JS中读取该值,如下所示:

$items["fruit_count"] = count( $fruits );

答案 3 :(得分:0)

根据您的代码,您可以使用它来遍历密钥

for(var fruitName in response.fruits)
    alert(fruitName + " => " + response.fruits[fruitName]))

但是如果你想像常规数组一样循环,我建议你的PHP水果对象需要修改为类似下面的内容

$items["fruits2"] = array(
              array("name" => "apple", "value"=>1.0),
              array("name" => "banana", "value"=>1.2),
              array("name" => "cranberry", "value"=>2.0),
            );

但是你的Javascript必须改为以下

alert( response.fruits2[0].value );
for(var i = 0; i < response.fruits2.length; i++)
    alert(response.fruits2[i].name + " => " + response.fruits2[i].value);

答案 4 :(得分:0)

首先将响应转换为数组

var data = Object.keys(response).map(function(_) { return response[_]; });

然后访问数据长度

data.length

答案 5 :(得分:-1)

根据给定的代码示例,您将数组分配给$ items [&#34; fruits&#34;]变量并编码$ fruits变量。请对$ items [&#34; fruits&#34;]变量进行编码,并检查您的编码。更改变量后,它对我来说很好。

谢谢,