3

私が次のようにJSONを扱っているとしましょう:

http://hndroidapi.appspot.com/nestedcomments/format/json/id/4620423?appid=hntoolbar&callback=

これは無限にネストできます。コメントの「レベル」を気にせずに、すべてのコメント情報を「フラット化された」形式で抽出し、ユーザー名とそのコメントの内容のリストだけを抽出したいと思います。Javascript / JQueryを使用してそのようなことをするにはどうすればよいですか?

4

2 に答える 2

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

aここ-解析されたJSON、b-結果;

b構造は

{user1: [comment,comment,comment],user2: [] ...}

http://jsfiddle.net/NkTst/1/

コメントに関する拡張情報がまだ必要な場合は、http://jsfiddle.net/NkTst/2/を確認してください

于 2012-10-08T06:35:26.093 に答える
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))

次に、一意の列名を見つけて、階層の0番目のレベルから行名を保持し、欠落しているキーなどを処理するユーティリティ関数を作成します(.update({"missingKey": ""}で実行しました)。素敵な小さなjsonからテーブルへのコンバーター(CSVに簡単にキャストできます)!

ただし、質問のjsonは表示されません。

于 2014-08-15T17:51:25.383 に答える