递归的麻烦;解析JSON

时间:2011-12-11 17:42:58

标签: javascript json recursion

我有一个像这样的json对象:

[{
    "thing": "Top",
    "data": {
        "childs": [{
            "thing": "a",
            "data": {
                "text": "sdfgdg1",
                "morestuff": {
                    "thing": "Top",
                    "data": {
                        "childs": [{
                            "thing": "a",
                            "data": {
                                "text": "sdfg2",
                                "morestuff": "",
                            }
                        },
                        {
                            "thing": "a",
                            "data": {
                                "text": "gfhjfghj3",
                                "morestuff": {
                                    "thing": "Top",
                                    "data": {
                                        "childs": [{
                                            "thing": "a",
                                            "data": {
                                                "text": "asdfsadf 2 4",
                                                "morestuff": {
                                                    "thing": "Top",
                                                    "data": {
                                                        "childs": [{
                                                            "thing": "a",
                                                            "data": {
                                                                "text": "asdfsadf 2 5",
                                                                "morestuff": {
                                                                    "thing": "Top",
                                                                    "data": {
                                                                        "childs": {
                                                                            "thing": "a",
                                                                            "data": {
                                                                                "text": "asdfsadf 2 6",
                                                                                "morestuff": "",
                                                                            },
                                                                            "data": {
                                                                                "text": "asdfsadf 2 6",
                                                                                "morestuff": "",
                                                                            }
                                                                        },
                                                                    }
                                                                },
                                                            }
                                                        }],
                                                    }
                                                },
                                            }
                                        }],
                                    }
                                },
                            }
                        }],
                    }
                },
            }
        },
        {
            "thing": "a",
            "data": {
                "text": "asdfasd1 2",
                "morestuff": {
                    "thing": "Top",
                    "data": {
                        "childs": [{
                            "thing": "a",
                            "data": {
                                "text": "asdfsadf 2 3",
                                "morestuff": "",
                            }
                        }],
                    }
                },
            }
        },
        {
            "thing": "a",
            "data": {
                "text": "dfghfdgh 4",
                "morestuff": "",
            }
        }],
    }
}]  

...而且我正在尝试迭代它并获得“文本”对象的总计数。

我似乎无法获得递归工作的东西..我认为我缺少对json和递归的基本级理解..

经过几天的变化:

count=0;
c2=0;
c3=0;
function ra(arr){
    //console.log(arr.data.morestuff)
    if(arr!==undefined && arr.data && arr.data.morestuff===""){
        c3++;

    }else if((arr && arr.data && typeof arr.data.morestuff==="object")){
            if(arr.data.morestuff.data.childs.length>1){
                for(var w=0;w<arr.data.morestuff.data.childs.length;w++){
                    count+=ra(arr.data.morestuff.data.childs[w])
                }
            }else{
                count+=ra(arr.data.morestuff.data.childs[0])
            }
    }
         return(c3)
}
countn=0;//top morestuff with no morestuff
tot=0;
function reps(obj){
tot=obj.data.childs.length;
console.log("tot="+tot)
    for(var x=0;x<tot;x++){
        tot+=ra(obj.data.childs[x])
        c3=0
        if(tot>1000){//trying to prevent a runaway loop somehwere
            break;
        }
    }
    console.log(tot)
}

reps(json[0]); 

我得出结论,我只是不知道。我得到了各种不同的结果;有些人已经接近将ra方法的回报加在一起,但没有任何一致(即错误)并且总是至少关闭几个。

JSON是一致的,虽然有一些未知数量的儿童和儿童,这就是我希望递归的原因。

这是一个小提琴:http://jsfiddle.net/CULVx/

理想情况下,我想计算每个文本对象,它的相对位置以及它拥有的子数,但我想如果我可以让计数工作,我可以把这些东西弄成数组。 ..

注意:我已经尝试过jsonParse和其他库无济于事。特别是,jsonParse尝试在此json上使用时会抛出Object has no method "match"错误。

1 个答案:

答案 0 :(得分:5)

如果您只想在任何深度所有 "text"属性,那么这应该足够了:http://jsfiddle.net/QbpqT/

但是,您有两次属性键(在最嵌套的对象中为"data")。由于对象不能包含具有相同键的两个属性,因此实际上有9个"text"属性;不是10。

var count = 0;

function iterate(obj) {
    for(var key in obj) { // iterate, `key` is the property key
        var elem = obj[key]; // `obj[key]` is the value

        if(key === "text") { // found "text" property
            count++;
        }

        if(typeof elem === "object") { // is an object (plain object or array),
                                       // so contains children
            iterate(elem); // call recursively
        }
    }
}

iterate(data); // start iterating the topmost element (`data`)

console.log(count); // 9