本帖最后由 u013156418 于 2014-01-05 23:18:07 编辑

解决方案 »

  1.   

    我想得到准确的层次关系,比如值为"beijing"的准确层次是students.student.address.city
      

  2.   

    自己统计下吧。JQ的$.EACH写个方法循环统计下
    var strjson=....;
    $.each(strjson,function(a,a_item){
       alert(a+":"+a_item);
    })
    这个瞧瞧  声明个变量 记录下父元素(这里的a)    不断循环这个就OK了。。  
      

  3.   

    。。  再用$.each  中间加个判断就好。。
    $.each(strjson,function(a,a_item){
        if(a_item.length>1)
        {
           $.each(a_item,function(b,b_item){
                alert(b+":"+b_item);
           })
        }
    })具体咋写你自个改改就好。。
      

  4.   

    还是不明白,小菜鸟别见怪!是不是用迭代会好一点?
    比如:json类似于这样的
    var json={
    "name":"zhansan",
    "age":23,
    "address":{
    "city":"beijing",
    "year":["气态流出物月报",0,1],
    "gas":{
    "gasSheet":"气态流出物月报",
    "H_adjust":1,
    "employer":{
    "midle":"sizhong",
    "hight":"sizhong"
    }
    },
    "time":{
    "year": ["气态流出物月报",0,1],
    "start":[1,"~"],
    "duration":31,
    "employer":{
    "midle":"sizhong",
    "hight":"sizhong"
    }
    }
    },
    "student":[13,"s1","s2"],
    "units":{"title":"function"} //怎么判断它是相对于根的子节点?
    }
    我要得到它的所有值对应的层次,比如“function”对应的是json.units.title,...怎么做?
      

  5.   

    function _type(obj){
        /// <summary>
        /// 返回数据类型的小写副本
        /// </summary>
        /// <param name="obj">目标对象</param>
        /// <returns>目标对象的数据类型的小写副本:string,date,number,array,boolean,object,regexp,function...</returns>
        return Object.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1].toLowerCase();
    }
    function getNS(ns,json,named){
        var keyNamed;
        for(var key in json){
            if(json.hasOwnProperty(key)){
                keyNamed    =   named + '.' + key;
                if(_type(json[key])=='object'){
                    ns[keyNamed]    =   '{}';//如果不想保留非值类型的结构,删除这句
                    getNS(ns,json[key],keyNamed);
                }else{
                    ns[keyNamed]    =   _type(json[key])=='array' 
                                            ? json[key].join(',') 
                                            : json[key];
                };
            }
        };
        return ns;
    };
    var ns=getNS({},json,"json");
    还是没搞明白这个是做什么用的,能说下么?
    上面的ns即可生成值类型[数组也被包含在内,生成连接符为,的字符串]的结构描述,这东东要是碰上两个值相同的,上哪查去呀以你的例子来说,ns结构为:
    ns={
        "json.name": "zhansan",
        "json.age": 23,
        "json.address": "{}",
        "json.address.city": "beijing",
        "json.address.year": "气态流出物月报,0,1",
        "json.address.gas": "{}",
        "json.address.gas.gasSheet": "气态流出物月报",
        "json.address.gas.H_adjust": 1,
        "json.address.gas.employer": "{}",
        "json.address.gas.employer.midle": "sizhong",
        "json.address.gas.employer.hight": "sizhong",
        "json.address.time": "{}",
        "json.address.time.year": "气态流出物月报,0,1",
        "json.address.time.start": "1,~",
        "json.address.time.duration": 31,
        "json.address.time.employer": "{}",
        "json.address.time.employer.midle": "sizhong",
        "json.address.time.employer.hight": "sizhong",
        "json.student": "13,s1,s2",
        "json.units": "{}",
        "json.units.title": "function"
    }
      

  6.   

    是这样的,我说一下大概流程吧:1.打开一个xml文件——>2.解析xml成json生成树形菜单——>3.对树形菜单进行操作(添加、删除、修改),但这些操作一般是基于student.address.city...这种格式的,所以首先的获取到一个值得准确节点层次,然后才能操作它。
    请问您这ns结构是怎么做得?我需要的就是这个啊!
      

  7.   

    如果真有此必要的话,你完全可以在第二步:解析xml成json生成树形菜单的时候,将其"层级"附加至要操作的对象之上;但个人感觉你这是走了弯路了,应该有更好更直接的方法.
      

  8.   

    大神,我用你的方法试了一下,是可以的,非常感谢,但是我做了小改动,发现了一个问题:之前的模式都是对象里面包含数组,那如果是数组里面有对象,似乎就不准确了,根据你的代码,我改完如下:function getNodes(json,named){
    var keyName;
    for(var key in json){
    keyName = named + "." + key;
    if(_type(json[key]) == "object"){
    getNodes(json[key],keyName);
    }else{
    if(_type(json[key]) == "array"){
    for(var i=0;i<json[key].length;i++){
    keyName = named+"."+key+"["+i+"]";
    document.write(keyName+"</br>");
    }
    }else{
    document.write(keyName+"</br>");
    }
    }
    }
    }function del(){
    getNodes(json,"Root");
    }
    能不能麻烦大神帮我看一下问题在哪?谢谢了,马上结贴给分,分不多,对不住了
      

  9.   

    解析是在后台java解析的,就是子前台打开xml文件,获取文件里面的文本内容,然后提交给后台,后台解析完了以后返回json数据给前台,前台根据返回json数据生成树形菜单。有点绕,我也感觉似乎一开始就想错了
      

  10.   


    if (_type(json[key][i]) == "object") {//加多个判断
        getNodes(json[key][i], keyName);
    } else {
        document.write(keyName + "</br>");
    }
    var json={ 
        "name":"zhansan", 
        "age":23, 
        "address":{ 
            "city":"beijing", 
            "year":["气态流出物月报",{a:1,b:"xx"},1], 
            "gas":{ 
                "gasSheet":"气态流出物月报", 
                "H_adjust":1, 
                "employer":{ 
                    "midle":"sizhong", 
                    "hight":"sizhong"    
                } 
            }, 
            "time":{ 
                "year": ["气态流出物月报",0,1], 
                "start":[1,"~"], 
                "duration":31, 
                "employer":{ 
                    "midle":"sizhong", 
                    "hight":"sizhong"    
                } 
            } 
        }, 
        "student":[13,"s1","s2"], 
        "units":{"title":"function"}    //怎么判断它是相对于根的子节点? 
    }
    输出:
    json.name
    json.age
    json.address.city
    json.address.year[0]
    json.address.year[1].a
    json.address.year[1].b
    json.address.year[2]
    json.address.gas.gasSheet
    json.address.gas.H_adjust
    json.address.gas.employer.midle
    json.address.gas.employer.hight
    json.address.time.year[0]
    json.address.time.year[1]
    json.address.time.year[2]
    json.address.time.start[0]
    json.address.time.start[1]
    json.address.time.duration
    json.address.time.employer.midle
    json.address.time.employer.hight
    json.student[0]
    json.student[1]
    json.student[2]
    json.units.title