【问题标题】:jQuery Ajax Success get returned Array Length?jQuery Ajax 成功返回数组长度?
【发布时间】:2014-07-07 03:05:10
【问题描述】:

我正在尝试循环从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 );
});
  • 这里 First Alert() 没问题,返回:"1.0"
  • 然后检测长度response.length 的第二个Alert() 返回:
    • undefined

那么我该如何循环这个数组(或)如何从 jQuery 端循环 Fruits(由 PHP 定义,如 $items["fruits"])?

【问题讨论】:

  • 因为response 是一个对象,而不是一个数组,所以它没有length 属性
  • 在现代浏览器中你可以使用Object.keys().length 所以Object.keys(response).length
  • 试试alert( response.fruits.length );

标签: javascript php jquery ajax arrays


【解决方案1】:

简单地尝试这样的事情

要在任何与 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?

【讨论】:

    【解决方案2】:

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

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

    可能看起来像

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

    【讨论】:

    【解决方案3】:

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

    var length = Object.keys(response).length
    

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        首先将响应转换为数组

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

        然后访问数据长度

        data.length
        

        【讨论】:

          【解决方案6】:

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

          谢谢,

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-13
            • 2011-11-18
            • 2012-02-20
            • 1970-01-01
            • 2011-11-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多