jQuery Ajax成功返回数组长度


jQuery Ajax Success get returned Array Length?

我正在尝试从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 );
});
  • 这里的第一个警报()是ok的,通过返回:"1.0"
  • 则第二个警报()检测长度response.length返回:
    • undefined

那么我怎么能循环这个数组(或)如何循环水果(由PHP定义的$items["fruits"])从jQuery结束请?

试试这样

在任何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); 
});
参考

如何有效地计算在JavaScript对象的键/属性的数量?

看起来你在PHP端创建了一个关联数组,这在JavaScript中很像object。对象没有.length属性。

您可以通过调用Object.keysArray.prototype.forEach或直接使用for..in循环来"循环"对象键。

可以是

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

要做到这一点,你必须将你的对象转换为有长度的东西,像这样:

var length = Object.keys(response).length

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

另一个解决方案是在PHP中为JSON对象添加一个"count"索引,然后在JS中读取该值,如下所示:

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

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

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);

将响应转换为数组优先

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

然后访问数据长度

data.length

根据给定的代码示例,您正在将数组分配给$items["fruits"]变量并编码$fruits变量。请对$items["fruits"]变量进行编码,并核对您的编码。在改变变量后,它的工作对我来说很好。

谢谢,