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 相关文章推荐
Prototype使用指南之base.js
Jan 10 Javascript
深入理解JavaScript定时机制
Oct 29 Javascript
IE8下String的Trim()方法失效的解决方法
Nov 08 Javascript
JavaScript SetInterval与setTimeout使用方法详解
Nov 15 Javascript
使用JS画图之点、线、面
Jan 12 Javascript
jquery图片倾斜层叠切换特效代码分享
Aug 27 Javascript
jquery实现简洁文件上传表单样式
Nov 02 Javascript
值得分享的轻量级Bootstrap Table表格插件
May 30 Javascript
js通过指定下标或指定元素进行删除数组的实例
Jan 12 Javascript
基于JS实现限时抢购倒计时间表代码
May 09 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
Jan 08 Javascript
javascript设计模式之装饰者模式
Jan 30 Javascript
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
自动分页的不完整解决方案
2007/01/12 PHP
利用php获取服务器时间的实现代码
2013/06/07 PHP
解析PHP自带的进位制之间的转换函数
2013/06/08 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
php注册审核重点解析(数据访问)
2017/05/23 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
JavaScript继承方式实例
2010/10/29 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
2013/06/05 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
2014/09/19 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
ES6新特性八:async函数用法实例详解
2017/04/21 Javascript
详细分析jsonp的原理和实现方式
2017/11/20 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
Python实现的凯撒密码算法示例
2018/04/12 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
浅谈Python中range与Numpy中arange的比较
2020/03/11 Python
Python 实现将某一列设置为str类型
2020/07/14 Python
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
工业设计专业个人求职信范文
2013/12/28 职场文书
写给老师的表扬信
2014/01/21 职场文书
小学校园活动策划
2014/01/30 职场文书
倡议书格式模板
2014/05/13 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
个人工作表现自我评价
2015/03/06 职场文书
高中政治教师教学反思
2016/02/23 职场文书
java实现面板之间切换功能
2022/06/10 Java/Android
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python