列表li排序去重的实现与优化

简介: 列表li排序去重的实现与优化

请看以下html:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
<div class="aBox" style="">
    <a href="javascript:void(0)" tabid="15">数学</a>
    <a href="javascript:void(0)" tabid="6">诚信</a>
    <a href="javascript:void(0)" tabid="10">奉献</a>
    <a href="javascript:void(0)" tabid="1">爱情</a>
    <a href="javascript:void(0)" tabid="23">感恩</a>
    <a href="javascript:void(0)" tabid="9">勤奋</a>
    <a href="javascript:void(0)" tabid="2">读书</a>
    <a href="javascript:void(0)" tabid="12">道德</a>
    <a href="javascript:void(0)" tabid="24">目标</a>
    <a href="javascript:void(0)" tabid="14">人生</a>
    <a href="javascript:void(0)" tabid="17">母爱</a>
    <a href="javascript:void(0)" tabid="16">英语</a>
    <a href="javascript:void(0)" tabid="22">童年</a>
    <a href="javascript:void(0)" tabid="3">励志</a>
    <a href="javascript:void(0)" tabid="18">劳动</a>
    <a href="javascript:void(0)" tabid="19">亲情</a>
    <a href="javascript:void(0)" tabid="7">爱国</a>
    <a href="javascript:void(0)" tabid="8">激励</a>
    <a href="javascript:void(0)" tabid="11">真理</a>
    <a href="javascript:void(0)" tabid="4">时间</a>
    <a href="javascript:void(0)" tabid="21">团结</a>
    <a href="javascript:void(0)" tabid="20">创新</a>
    <a href="javascript:void(0)" tabid="5">友情</a>
    <a href="javascript:void(0)" tabid="13">理想</a>
    <a href="javascript:void(0)" tabid="1">爱情</a>
    <a href="javascript:void(0)" tabid="23">感恩</a>
    <a href="javascript:void(0)" tabid="9">勤奋</a>
    <a href="javascript:void(0)" tabid="2">读书</a>
    <a href="javascript:void(0)" tabid="12">道德</a>
    <a href="javascript:void(0)" tabid="24">目标</a>
    <a href="javascript:void(0)" tabid="14">人生</a>
    <a href="javascript:void(0)" tabid="17">母爱</a>
    <a href="javascript:void(0)" tabid="16">英语</a>
</div>
</script>
</body>
</html>

假设根据li下的tabid来排序,这里涉及到去重和排序两个问题;

A 同学的代码如下:

<script src="https://code.jquery.com/jquery-3.2.1.js"></script>
<script>
    $(function(){
        let arr=[],
            alla=$('.aBox').find('a');
        $('.aBox').find('a').remove();
        for(let i=0;i<alla.length;i++){
            arr.push(alla[i])
        }
        arr.sort(function(a1,a2){
            let n1=Number($(a1).attr('tabid'));
            let n2=Number($(a2).attr('tabid'));
            return n1-n2;
        });
        for(let m=0;m<arr.length;m++){
            for(let n=m+1;n<arr.length;n++){
                if($(arr[m]).attr('tabid')==$(arr[n]).attr('tabid')){
                    arr.splice(n,1);
                    m--;
                    n--;
                }
            }
        }
       for(let j=0;j<arr.length;j++){
           $('.aBox').append(arr[j]);
       }
    })

我们看到,她用了4次循环;

我的第一版代码如下:

var ar = document.querySelectorAll(".aBox");
    var ara=document.querySelectorAll(".aBox a");
    var frag=document.createDocumentFragment();
    for (var i = 0,l=ara.length ; i < l; i++) {
        var k='a[tabid=\"'+i+'\"]';
        var x=document.querySelectorAll(k)[0];
        if(x){
            frag.appendChild(x);
        }
    }
    $(".aBox a").remove();
    $(".aBox").append($(frag));

我们看到,她用了4次循环;

我的第一版代码如下:

var ar = document.querySelectorAll(".aBox");
    var ara=document.querySelectorAll(".aBox a");
    var frag=document.createDocumentFragment();
    for (var i = 0,l=ara.length ; i < l; i++) {
        var k='a[tabid=\"'+i+'\"]';
        var x=document.querySelectorAll(k)[0];
        if(x){
            frag.appendChild(x);
        }
    }
    $(".aBox a").remove();
    $(".aBox").append($(frag));

能否优化?


第二版如下:

    $(
                function () {
                    var ar = $(".aBox");
                    var frag = document.createDocumentFragment();
                    var i = 1;
                    while (i) {
                        let x = ar.find('a[tabid=\"' + i++ + '\"]')[0];
                        x ? frag.appendChild(x) : i = 0;
                    }
                    ar.empty().append($(frag))
                }
        )

虽然看着代码少了,

但是重要的是性能,而非代码行数,这里主要包括,l=arr.length,这样能减少对数组的操作;ar:首先将变量保存,这是很好的习惯,然后ar.find能减少对DOM的遍历;虽然find()括号中属性选择器一般遍历的时间会更长,但是这里不存在这个问题,主要因为只需要对已经保存了的ar进行遍历,绕开了DOM,所以性能会有提高;

但推荐用原生js写比较好;用兴趣的小伙伴可以试一试,也很简单的;

也有小伙伴是这样写的,供大家参考,也是一种思路:

Array.prototype.reset=function(attr){
this.sort((a, b) => a.getAttribute(attr) - b.getAttribute(attr));
var hash={},res= [];
var len=this.length;
for(var i=0;i<len;i++){
var key= this[i].innerHTML;
if(!hash[key]){
res.push(this[i]);
hash[key]=1;
}
}
return res
}
var container=document.querySelector('.aBox');
var arr=document.querySelectorAll('.aBox>a');
var frag = document.createDocumentFragment();
var list=[],len=arr.length;
for(var i=0;i<len;i++){
list.push(arr[i])
}
var b=list.reset('tabid')
len=b.length;
for(var i=0;i<len;i++){
frag.appendChild(b[i])
}
container.innerHTML='';
container.appendChild(frag)


目录
相关文章
Java中的多线程实现及性能优化
【4月更文挑战第11天】本文将深入探讨Java中的多线程实现方法,包括继承Thread类、实现Runnable接口以及使用Executor框架。同时,我们将分析多线程中的性能瓶颈,并提出相应的优化策略,以提高程序的执行效率。
|
负载均衡 安全 Linux
在Linux中,什么是负载均衡,并且如何在Linux中实现它。
在Linux中,什么是负载均衡,并且如何在Linux中实现它。
|
计算机视觉 Python
python 安装 cv2 - 已解决
python 安装 cv2 - 已解决
732 0
|
编解码 测试技术
AV1编码时间下降,接近使用水平
AV1最初发布时,编码速度缓慢,时间过长,严重影响编码器的可用性。随着不断的优化,其编码时间已经有很大改进,几乎可以使用。
1574 0
AV1编码时间下降,接近使用水平
|
Linux
【Linux】深入理解cd命令
【Linux】深入理解cd命令
408 0
|
消息中间件 SQL JSON
【大数据开发运维解决方案】Kylin消费Kafka数据流式构建cube
文章开始之前先说明环境情况,这里kylin消费的kafka数据是从Oracle 数据库用Ogg For Bigdata以json格式将数据投递到kafka topic的,投递的时候,关于insert和update 之前的数据投递到名为 ZTVOUCHER_INS 的topic,而delete和update之后的数据投递到名为 ZTVOUCHER_DEL 的topic中,这里主要介绍kylin如何消费数据创建流式cube。
【大数据开发运维解决方案】Kylin消费Kafka数据流式构建cube
|
SQL Oracle 关系型数据库
详解 Seata AT 模式事务隔离级别与全局锁设计
Seata AT 模式是一种非侵入式的分布式事务解决方案,Seata 在内部做了对数据库操作的代理层,我们使用 Seata AT 模式时,实际上用的是 Seata 自带的数据源代理 DataSourceProxy,Seata 在这层代理中加入了很多逻辑,比如插入回滚 undo_log 日志,检查全局锁等。
1031 0
详解 Seata AT 模式事务隔离级别与全局锁设计
|
移动开发 JavaScript 小程序
Uniapp+UviewUI实现购物商城
Uniapp+UviewUI实现购物商城
Uniapp+UviewUI实现购物商城
|
安全 定位技术 索引
Powershell 数据容器:数组、ArrayList 与 哈希表
本文介绍 Powershell 语言中的主要数据容器: 数组、ArrayList 与 哈希表
891 0
|
设计模式 存储 Java
【Java设计模式 规范与重构】 五 重构实战:基于ID生成器case(下)
【Java设计模式 规范与重构】 五 重构实战:基于ID生成器case(下)
337 0