最近在做一个有关Mongo GUI的Demo,遇到这样的一个需求:
把一JSON字符串,如{id:1,name:{first:Zhang,last:Shell}}
转换为如下的输出格式:
{
id:1
name:
{
first:Zhang
last:Shell
}
}
另外,内嵌对象的级别是无限嵌套的,即内嵌对象里可能再内嵌有其他的对象。还有一点,也正是Mongo的Free-Schema模式,前一条记录可能与后一条记录的关系很弱。
该如何呢?其实也很简单,就是用递归的算法。毕竟这场景太“递归Style”了!
附上JS写的递归算法
if(value.indexOf("{") == 0){
var kvs = JSON.parse(value);
var str = "<br/><table id='contt'><tr><td>{</td></tr>";
for(var k in kvs){
str += cycleIt(k,kvs[k],"","");
}
str += "<tr><td>}</td></tr></table>";
(document.getElementsByName("jsons")[i]).innerHTML = str;
}
function cycleIt(k, objs, td, prefix){
var str = "";
td += "<td></td>";
prefix += k+".";
if(objs instanceof Object){
str += "<tr>"+td+"<td><span>"+k+" :</span></td></tr>"+"<tr>"+td+"<td>{</td></tr>";
for(var each in objs){
str += cycleIt(each, objs[each], td, prefix);
}
str += "<tr>"+td+"<td>}</td></tr>";
}
else{
str += "<tr>"+td+"<td><span>"+k+" : </span></td><td>"+objs+"</td></tr>";
}
return str;
}
JS天生支持JSON,JSON.parse(value)即可将JSON字符串转化为JSON对象。for循环中的var k,即为JSON中当前迭代的key,而kvs[k]即为当前迭代key的value。
递归算法真正的解决了这个问题,并为后续的一些其他需求提供了方便性。
如,我需要在点击某个字段名(Key)的时候,该字段的值(Value)(包括其内嵌的,或者再内嵌的对象属性值)的backgroundColor换成某个颜色这样。是相当的简单且方便的。这里,只需把prefix设置为标签的属性名即可。
……