这一课程主要是对JS的数据类型和通用的数据结构、算法方面的练习。
字符串相关处理
在做字符串相关练习时,遇到去除空格、替换字符串等题目时,首先想到的方法肯定是利用replace()方法结合正则表达式就可以有效到达目的,直到看到以下字样:
如果不使用正则表达式,replace(subString,newString)是只会替换第一个出现的subString,而不能全局替换。于是第二个想到的是结合字符串的split()方法和数组的join()方法,先把字符串根据替换字符拆开,再重新拼接就可以替换相应字符,例如:
var str = "my name is apple";
str = str.split(String.fromCharCode(32)).join(""); //去除半角空格
结果我又发现,关于数组的方法是在后面的练习才会用到。最后只能写了一个循环,一个个字符判断继而利用字符串的slice()重新拼接字符串。
数组转换为类似树的对象
最后一个练习是将如下数组转换为类似树的一个对象:
//数组
var menu = [
[1, "Area1", -1],
[2, "Area2", -1],
[3, "Area1-1", 1],
[4, "Area1-2", 1],
[5, "Area2-1", 2],
[6, "Area2-2", 2],
[7, "Area1-2-3", 4],
[8, "Area2-2-1", 6],
];
//转换后的对象
var menuObject = {
"1": {
name: "Area1",
subMenu: {
"3": {
name: "Area1-1"
},
"4": {
name: "Area1-2",
subMenu: {
"7": {
name: "Area1-2-3"
}
}
}
}
}
...
}
稍微费了些时间,自己想出的方法类似广度搜索(之后百度到的名字),就是根据每个父结点ID查询子节点,并添加到这个父结点上,把这个函数写成递归的形式:
//方法一:类似广度搜索(自己想的)
//时间复杂度过大
function ArrToObj() {
let obj = {};
return AddObj(obj, -1, 0);
}
//根据父结点ID寻找添加子结点
//parid:父结点ID
//start:数组查询开始位置
function AddObj(obj, parid, start) {
let i = start;
while (i < menu.length) {
let curid = menu[i][0],
curnme = menu[i][1],
preid = menu[i][2];
if (preid == parid) {
if (!obj) {
obj = {};
}
obj[curid] = {};
obj[curid].name = curnme;
if (AddObj(obj[curid].subMenu, curid, i + 1)) {
obj[curid].subMenu = AddObj(obj[curid].subMenu, curid, i + 1);
//寻找当前结点的子结点
}
}
i++;
}
return obj;
}
但这种方法一看就知道时间复杂度肯定低不了,最后百度了一下找到了另一种时间复杂度较小的方法:从后向前生成树,即是从叶结点向上生成,参考了这篇博文Js 将数组按父子关系转换为对象树,最终实现代码如下:
//方法二:从后向前生成树(参考百度)
//时间复杂度比前者小
function AscendTree() {
let nodes = toObjArr();
for (let i = menu.length - 1; i >= 0; i--) {
let curid = menu[i][0],
preid = menu[i][2];
//从后向前遍历,所以父结点一定就是nodes对象的子结点(而不是后代结点)
if (preid != -1) {
if (!nodes[preid].subMenu) {
nodes[preid].subMenu = {};
}
nodes[preid].subMenu[curid] = nodes[curid];
delete nodes[curid];
}
}
return nodes;
}
//先将数组转为各元素平级的对象(相当于所有结点都是nodes的子结点)
function toObjArr() {
let nodes = {};
for (let i in menu) {
nodes[menu[i][0]] = {};
nodes[menu[i][0]].name = menu[i][1];
}
return nodes;
}
昨天看普心的思维的问题解决章节,心理学家西蒙曾说过类似一句话:
人们寻求解决问题的方法时,并不总要找到最优的方法,而是只要找到最满意的方法。
但要努力的话,还是要将自己“满意”的标准尽量靠近“最优”的标准,多多反思重构自己的代码吧~