IFE Day22-24:Javascript里面的居民们笔记


这一课程主要是对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;
    }

昨天看普心的思维的问题解决章节,心理学家西蒙曾说过类似一句话:

人们寻求解决问题的方法时,并不总要找到最优的方法,而是只要找到最满意的方法。

但要努力的话,还是要将自己“满意”的标准尽量靠近“最优”的标准,多多反思重构自己的代码吧~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
折叠面板是一个常见的 UI 组件,可以在 Web 页面上实现内容的展开与收缩。以下是一个 HTML 右边折叠面板的实现示例: HTML 代码: ```html <div class="panel-container"> <div class="panel-header"> <h3>折叠面板标题</h3> <span class="panel-arrow"></span> </div> <div class="panel-content"> <p>折叠面板内容</p> </div> </div> ``` CSS 代码: ```css .panel-container { position: relative; width: 400px; height: 100%; } .panel-header { position: relative; z-index: 1; height: 40px; background-color: #f0f0f0; border-bottom: 1px solid #d9d9d9; cursor: pointer; } .panel-header h3 { margin: 0; padding: 0 20px; line-height: 40px; font-size: 16px; font-weight: bold; color: #333; } .panel-arrow { position: absolute; top: 50%; right: 20px; width: 0; height: 0; margin-top: -5px; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid #999; transition: transform 0.3s ease; } .panel-content { position: absolute; top: 40px; right: 0; z-index: 0; width: 0; height: 0; overflow: hidden; background-color: #fff; transition: width 0.3s ease; } .panel-container.active .panel-header .panel-arrow { transform: rotate(180deg); } .panel-container.active .panel-content { width: 300px; height: 300px; } ``` 解释: 1. `.panel-container` 设置容器的宽度和高度,并设置为相对定位,以便内部元素进行定位。 2. `.panel-header` 设置折叠面板的标题栏样式,包括高度、背景色、边框和光标样式。 3. `.panel-header h3` 设置标题栏标题的样式,包括字体大小、颜色和粗细等。 4. `.panel-arrow` 设置标题栏右侧的箭头样式,包括定位、大小和颜色等。使用 `transition` 属性实现箭头旋转效果。 5. `.panel-content` 设置折叠面板的内容区样式,包括定位、大小、背景色和过渡效果等。使用 `overflow: hidden` 属性隐藏内容超出部分。 6. `.panel-container.active .panel-header .panel-arrow` 和 `.panel-container.active .panel-content` 通过 `.active` 类实现面板的展开和收缩效果。 以上是一个简单的 HTML 右边折叠面板的实现示例。可以根据实际需求调整样式和布局。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值