Javascript 更新 JavaScript 数组的 uniq 方法


Posted in Javascript onJanuary 23, 2008

上次写的一篇《JavaScript 数组的 uniq 方法》,发现代码的问题还是存在。比如如果数组内有 undefined 元素就无法过滤等。

昨天看见 Lazy 兄弟重新更新了函数,现在他是这样子写的:

Array.prototype.uniq = function() {
    var resultArr = [],
        returnArr = [],
        origLen = this.length,
        resultLen;

    function include(arr, value) {
        for (var i = 0, n = arr.length; i < n; ++i){
            if (arr[i] === value) {
                return true;
            }
        }

        return false;
    }

    resultArr.push(this[0]);
    for (var i = 1; i < origLen; ++i) {
        if (include(resultArr, this[i])) {
            returnArr.push(this[i]);
        } else {
            resultArr.push(this[i]);
        }
    }

    resultLen = resultArr.length;
    this.length = resultLen;
    for (var i = 0; i < resultLen; ++i){
        this[i] = resultArr[i];
    }

    return returnArr;
}按照他的说法:“这种解法在整个过程对原有数组的改变只有两次,效率比其他两种高了2个数量级左右!”,我实测了下此函数的效率,的确如此(测试连接点这里)。

我也重新编写和更新了我的函数,现在看起来是这个样子的:

Array.prototype.uniq = function() {
    var tmp    = new Array;
    var length = this.length;

    for(var i = 0; i < length; i++) {
        var push = true;
        for(var j = i + 1; j < length; j++) {
            if(this[j] === this[i]) {
                push = false;
                break;
            }
        }

        if(push) {
            tmp.push(this[i])
        }
    }

    this.length = tmp.length;
    for (var i = 0; i < tmp.length; i++) {
        this[i] = tmp[i];
    }

    return tmp;
}由同一个页面测试所得,效率还是 Lazy 兄弟的稍许快些。经过一点思考以后,我有了些一点点我的心得:

我的函数 for 嵌套可以用一个函数独立(就如 Lazy 兄弟的 include 函数一样)。在上述的情况下,调用函数会比循环判断效率要高一些。 
数组的循环读写操作在数据量大的情况下应格外的注意效率问题 
Lazy 兄弟的结论:

对数组的改变开销巨大,如果可能,尽量在不改变原有数组的情况下进行操作。
如最终需要改变数组自身,可将结果赋予原有数组来操作。另外,对于 length
的计算,似乎效率并未受其影响。Lazy 兄弟的 resultArr 数组按照他这样的写法就可以保存同样的值,在这里赞一个(虽然我的函数经过一点小的修改也可以实现)。感兴趣的朋友可以去 Lazy 的页面去看看。

最后,推荐阅读一下王元涛兄弟的 JavaScript 数组的 uniq 方法,万分感谢。

Javascript 相关文章推荐
javascript 写类方式之一
Jul 05 Javascript
xml 封装与解析(javascript和C#中)
Jul 26 Javascript
javascript 数据类型转换(parseInt,parseFloat)
Jul 20 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
Apr 02 Javascript
window.onload使用指南
Sep 13 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
Nov 29 Javascript
javascript基础知识
Jun 07 Javascript
省市选择的简单实现(基于zepto.js)
Jun 21 Javascript
AngularJS基础 ng-mouseleave 指令详解
Aug 02 Javascript
微信开发 消息推送实现代码
Oct 21 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
Aug 24 Javascript
html中两种获取标签内的值的方法
Jun 16 jQuery
Javascript 各浏览器的 Javascript 效率对比
Jan 23 #Javascript
Javascript 写的简单进度条控件
Jan 22 #Javascript
用jQuery实现检测浏览器及版本的脚本代码
Jan 22 #Javascript
零基础学JavaScript最新动画教程+iso光盘下载
Jan 22 #Javascript
用js 让图片在 div或dl里 居中,底部对齐
Jan 21 #Javascript
jquery 插件 人性化的消息显示
Jan 21 #Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
Jan 21 #Javascript
You might like
第十三节--对象串行化
2006/11/16 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
javascript中直接写php代码的方法
2013/07/31 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
详解Web使用webpack构建前端项目
2017/09/23 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python查询sqlite数据表的方法
2015/05/08 Python
python脚本监控docker容器
2016/04/27 Python
Python手机号码归属地查询代码
2016/05/04 Python
python实现录音小程序
2020/10/26 Python
python斐波那契数列的计算方法
2018/09/27 Python
Pandas库之DataFrame使用的学习笔记
2019/06/21 Python
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
Python在Matplotlib图中显示中文字体的操作方法
2019/07/29 Python
python下载库的步骤方法
2019/10/12 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
2019/12/18 Python
python实现贪吃蛇双人大战
2020/04/18 Python
W Concept美国:精选全球独立设计师
2017/02/22 全球购物
公积金转移接收函
2014/01/11 职场文书
简历中个人自我评价分享
2014/03/15 职场文书
程序员求职信
2014/04/16 职场文书
白酒代理协议书范本
2014/10/26 职场文书
大学学生会辞职信
2015/05/13 职场文书
元素水平垂直居中的方式
2021/03/31 HTML / CSS
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android