87,907
社区成员
发帖
与我相关
我的任务
分享
将下面这段JSON解析成js对象。
语法:
{"$ref":"$"} // 引用根对象
{"$ref":"@"} // 引用自己
{"$ref":".."} // 引用父对象
{"$ref":"../.."} // 引用父对象的父对象
{"$ref":"$.member[0].to"} // 基于路径的引用
求高手!!
{
"from": {
"city": "南京",
"province": "江苏"
},
"grilFriend": {
"boyFriend": {
"$ref": ".."
},
"from": {
"$ref": "$.from"
},
"language": "English",
"name": "章泽天",
"self": {
"$ref": "@"
},
"to": {
"city": "中关村",
"member": {
"$ref": "$"
},
"province": "北京"
}
},
"language": "汉语",
"name": "刘强东",
"self": {
"$ref": "@"
},
"to": {
"$ref": "$.grilFriend.to"
}
}
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));