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 相关文章推荐
JSF中confirm弹出框的用法示例介绍
Jan 07 Javascript
angularJS中router的使用指南
Feb 09 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
Dec 03 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
May 16 Javascript
浅谈js多维数组和hash数组定义和使用
Jul 27 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
Mar 21 Javascript
Angular2入门--架构总览
Mar 29 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
May 08 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
Jun 24 Javascript
JavaScript 高性能数组去重的方法
Sep 20 Javascript
javascript系统时间设置操作示例
Jun 17 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
Jan 21 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
融入意大利的咖啡文化
2021/03/03 咖啡文化
一些常用的php函数
2006/12/06 PHP
php获取汉字首字母的函数
2013/11/07 PHP
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
19个Android常用工具类汇总
2014/12/30 PHP
php中删除、清空session的方式总结
2015/10/09 PHP
Js中的onblur和onfocus事件应用介绍
2013/08/27 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
超简单JS二级、多级联动的简单实例
2014/02/18 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
2019/02/11 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
[32:36]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第二场 12.12
2020/12/16 DOTA
深入浅析Python字符编码
2015/11/12 Python
Python批量修改文本文件内容的方法
2016/04/29 Python
python更改已存在excel文件的方法
2018/05/03 Python
Python Grid使用和布局详解
2018/06/30 Python
python实现XML解析的方法解析
2019/11/16 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
python如何实现单链表的反转
2020/02/10 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
澳大利亚便宜隐形眼镜购买网站:QUICKLENS Australia
2018/10/06 全球购物
Linux开机引导的步骤是什么
2014/02/26 面试题
三好学生自我鉴定
2013/12/17 职场文书
《充气雨衣》教学反思
2014/04/07 职场文书
三方股东合作协议书
2014/10/28 职场文书
幼师中班个人总结
2015/02/12 职场文书
大学生党课感想
2015/08/11 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis
nginx内存池源码解析
2021/11/20 Servers