笔试题:用js实现一个函数,能使输入特定的字符串转化为特定结构化数据。(该题与阿里笔试题编程题之一一样)
字符串仅由小写字母和[,]构成,且字符串不包含多余的空格(阿里的提示,携程没有)
示例一:‘abc’->{value:'abc'}
示例二:‘[abc[bcd[def]]]’->{value:'abc',children:{value:'bcd',children:{value:'def'}}}
思路(我的):
1.上面很明显的给出了两个不同类型的字符串,所以输出的结果需分成两类;
2.主要考点集中在第二种,第二种字符串输出的形式可以看出,要输出一种树形结构对象;
3.要想输出树形结构对象,如果按照顺序来思考的话,会进入一个逻辑复杂度很高的循环里,所以该题应该先输出最末端的一个树枝末梢,也就是树形结构对象里面最内层的子对象:{value:'def'},然后再逐次向外扩张,也就是一个类似递归的过程。
代码实现:
function normalize(str){
var obj = {};
if(str.indexOf('[') == -1){ //判断两种字符串,并分别处理
obj.value = str;
return obj;
}else{
var parts = str.split('[');
parts.shift(); //生成的数组中,第一个元素为空,需删除
var len = parts.length;
obj.value = parts[len-1].slice(0,len);//最小的子类对象出现
parts.pop(); //删除数组最后一个元素,它比较特殊,所以特殊处理
for(var i=parts.length-1;i>=0;i--){ //把剩余的循环“递归”
obj = handleArr(parts,obj);
parts.pop();
}
return obj;
}
}
function handleArr(arr,obj){
var o = {};
var len = arr.length;
o.value = arr[arr.length-1];
o.children = obj;
return o;
}
console.log(normalize('abc'))
console.log(normalize('[abc[bcd[def]]]'))
最终输出效果如下图:
当然了,个人觉得这个实现可能并不能满足所有的输入情况,但是在笔试中,利用二十分钟的时间去实现这个基础要求应该是足够了,毕竟笔试时间也就60分钟。
PS:如果大家有更好更全的方法,欢迎评论交流~