使用jQuery $ .each,Json错误,结果为1

时间:2013-08-21 19:05:44

标签: javascript json jquery jsonp

基本上我正在将JSON结果转换为html并使用$ .each迭代多个键。例如,我正在撤回Facebook帖子,并在该帖子中迭代喜欢的内容。

问题在于,当有多个“喜欢”时,一切都很有效!虽然当只有1个“喜欢”时,“源”键会从结果集中删除,而我的javascript会因为我希望它存在而中断。知道为什么$ .each正在为单个节点跳过一个级别吗?以下是我的代码:

* JQUERY **

          $.each(post.likes.item, function(i, like){
             $(currentpost).find('div.cc_likes').append(like + ',');
             console.log(like)
          });              

* JSON RESULT **

* Single Like

       likes": {
            "item": {
                "source": {
                    "cta": "Mary Smith",
                    "url": "http:\/\/www.facebook.com\/",
                    "photo": {
                        "image": "https:\/\/graph.facebook.com\/"
                    }
                }
            },

控制台中的结果:

    Object 
      cta: "MaryAnn Smith" 
      photo: Object 
      url: "http://www.facebook.com/" 

* 多个喜欢

        "likes": {
            "item": [
                {
                    "source": {
                        "cta": "Bobby Carnes Sr.",
                        "url": "http:\/\/www.facebook.com",
                        "photo": {
                            "image": "https:\/\/graph.facebook.com\"
                        }
                    }
                },
                {
                    "source": {
                        "cta": "Jenna Purdy",
                        "url": "http:\/\/www.facebook.com\",
                        "photo": {
                            "image": "https:\/\/graph.facebook.com\"
                        }
                    }
                },
                {
                    "source": {
                        "cta": "Kevin Say",
                        "url": "http:\/\/www.facebook.com\",
                        "photo": {
                            "image": "https:\/\/graph.facebook.com\"
                        }
                    }
                }
            ],
            "count": "10",
            "count_display": "10"
        },

控制台中的结果:

    Object
      source: Object
        cta: "Kevin Smith"
        photo: Object
        url: "http://www.facebook.com/"

2 个答案:

答案 0 :(得分:1)

由于$.each()需要像object这样的数组或数组作为参数,因此在使用对象post.likes.item之前,请检查它是否为数组。 以下代码将始终将数组传递给jQuery -

     $.each([].concat(post.likes.item), function(i, like){
         $(currentpost).find('div.cc_likes').append(like + ',');
         console.log(like)
      });   

<强>解释

[]是JavaScript中的空数组。 JavaScript中的每个数组都有concat方法。

[].concat(obj)obj连接到空数组并返回一个数组。

  • 如果obj不是数组,则结果为[obj],这是一个包含一个项目的数组。
  • 如果obj是一个数组,则结果是obj的深层副本,该副本已经是一个数组。

More about concat method

答案 1 :(得分:1)

        if ( isArray ) {
        for ( ; i < length; i++ ) {
                value = callback.call( obj[ i ], i, obj[ i ] );

                if ( value === false ) {
                    break;
                }
            }
        } else {
            for ( i in obj ) {
                value = callback.call( obj[ i ], i, obj[ i ] );

                if ( value === false ) {
                    break;
                }
            }
        }

这是在JSON返回上运行的jquery代码。发生的事情是,当您查看多个结果时,它循环遍历数组,返回每个基础级别对象。但是,当您在单个返回上运行它时,它将循环遍历对象属性(在本例中为“source”),并返回该属性的值。

这里有两个选择。您可以确保单个项目仍然放在一个数组中,或者您可以检查客户端上的单个项目。在大多数情况下,Moazzam Khan建议的方式是最好的方式。