0

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

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

* 查询 **

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

* JSON 结果 **

*单喜欢

       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/"
4

2 回答 2

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 代码。发生的事情是,当您查看多个结果时,它会遍历数组,返回每个基本级别的对象。但是,当您在单次返回时运行它时,它会循环遍历对象属性(在本例中为“源”),并返回该属性的值。

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

于 2013-08-21T19:24:04.513 回答
1

由于$.each()需要一个数组或类似对象的数组作为参数,因此在使用该对象之前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是一个数组,那么 result 是一个深拷贝,obj它已经是一个数组。

更多关于 concat 方法

于 2013-08-21T19:11:35.103 回答