基本上我正在将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/"
答案 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
的深层副本,该副本已经是一个数组。答案 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建议的方式是最好的方式。