你的需求是要取到$ref的所有值?

解决方案 »

  1.   

    可以这么说,但是不确切。更加明确的需求是将上面字串转为JS对象,第一步我们可以直接eval就可以,但是得到的对象也不是最终对象。
      

  2.   

    其实只要拿到JSON的node路径这个问题也好解决!
      

  3.   

    简单写了一个。http://jsfiddle.net/VBgQF/var obj = {
    path : '/',
    "from" : {
    path : '/from',
    "city" : "南京",
    "province" : "江苏"
    },
    "grilFriend" : {
    path : '/grilFriend',
    "boyFriend" : {
    path : '/grilFriend/boyFriend',
    "$ref" : ".."
    },
    "from" : {
    path : '/grilFriend/from',
    "$ref" : "$.from"
    },
    "language" : "English",
    "name" : "章泽天",
    "self" : {
    path : '/grilFriend/self',
    "$ref" : "@"
    },
    "to" : {
    path : '/grilFriend/to',
    "city" : "中关村",
    "member" : {
    path : '/grilFriend/to/member',
    "$ref" : "$"
    },
    "province" : "北京"
    }
    },
    "language" : "汉语",
    "name" : "刘强东",
    "self" : {
    path : '/self',
    "$ref" : "@"
    },
    "to" : {
    path : '/to',
    "$ref" : "$.grilFriend.to"
    }
    };//入口
    var parse = function(o, root) {
    root = root == null ? o : root;
    var _ref;
    for (var i in o) {
    if (o.hasOwnProperty(i)) {
    o[i]['_parent'] = o;
    if (i == '$ref') {
    _ref = computeRef(o[i], o, obj);
    } else if ( typeof (o[i]) == 'object' && i != '_parent') {
    parse(o[i], root);
    }
    }
    }
    if (_ref) {
    o['$ref'] = _ref;
    }
    return o;
    };var computeRef = function(regx, o, root) {
    if (regx == '@') {
    return o
    } else if (regx[0] == '$') {
    if (regx.length == 1) {
    return root
    } else {
    var path = regx.split('.');
    path.splice(0, 1);
    return getNode(root, path)
    }
    } else if (regx.slice(0, 2) == '..') {//认定lz的路径书写格式为../../..   没有做过多处理
    var l = regx.split('/').length, p = o;
    for (var i = 0; i < l; i++) {
    if (p['_parent'])
    p = p['_parent'];
    }
    return p
    }
    }
    var getNode = function(node, path) {
    if (path.length == 0) {
    return node
    }
    var o = node[path[0]];
    path.splice(0, 1);
    return o ? getNode(o, path) : node
    }console.log(parse(obj));
      

  4.   

    加了path跟逻辑无关。只为方便调试- -。
      

  5.   

    加了path跟逻辑无关。只为方便调试- -。感动得要哭了,真是中国好网友,谢谢。
    我后面问到朋友了,他说一个DOJO貌似可以解决,搜索了一下http://www.oschina.net/question/109503_120507最后,真心感谢这位高智商网友。
      

  6.   

    我测试了一下感觉还是有一点点问题,就是应该替换他本身的而不是将对象赋值给ref这个属性
      

  7.   

    加了path跟逻辑无关。只为方便调试- -。
    加了一个对象clone的方法就可以了,我开始直接复制就不行