假设我正在处理JSON:
http://hndroidapi.appspot.com/nestedcomments/format/json/id/4620423?appid=hntoolbar&callback=
可以无限嵌套。我想以“扁平化”格式提取所有评论信息,只是提取用户名列表和评论内容,而不必担心评论的“级别”。我如何使用Javascript / JQuery做这样的事情?
答案 0 :(得分:2)
使用递归:
var getall = function(comments,out) {
var out = out || {};
var cuser = undefined;
var comment;
for (var key in comments) {
if (key == 'username') {
cuser = comments[key];
continue;
}
if (key == 'comment') {
comment = comments[key];
continue;
}
var mytype = typeof(comments[key]);
if (mytype == 'object'
|| mytype == 'array') {
out=getall(comments[key],out);
};
}
if (cuser !== undefined) {
if (out[cuser] === undefined) {
out[cuser] = [];
}
out[cuser].push(comment);
}
return (out);
}
b=getall(a);
console.log(b);
这里 - 解析JSON,b - 结果;
b结构是
{user1: [comment,comment,comment],user2: [] ...}
如果您仍需要有关评论的扩展信息,请检查http://jsfiddle.net/NkTst/2/
答案 1 :(得分:0)
这是我在python中必须这样做时所做的: (虽然不完整,但我会尝试在javascript中稍后进行实践。) 我发布了这个,因为递归的想法在这个中更清楚。
#Builds the names and makes a nested list with {"table.hierarchy.id":value} pairs:
def undic(dic,levs=0,tmp=""):
if(isinstance(dic,dict)):
return([undic(dic[d],levs=levs+1,tmp=tmp+d+".") for d in dic.keys()])
else:
return {tmp : dic}
#Flattens the list to something we can easilly work with:
def flat_content(dic):
ll=undic(dic)
if(isinstance(ll[0],dict)):
return(ll)
return(reduce(lambda x,y:x+y,ll))
然后找到唯一的列名并保持行级别的第零级别的行名称,使一些实用程序函数处理丢失的键等(我用.update({" missingKey&#34) ;:""})你有一个很好的小json到表转换器(很容易转换为CSV)!
虽然你的问题中的json不可见。