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 相关文章推荐
jQuery 白痴级入门教程
Nov 11 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
Mar 28 Javascript
javascipt基础内容--需要注意的细节
Apr 10 Javascript
基于jQuery中对数组进行操作的方法
Apr 16 Javascript
JS格式化数字保留两位小数点示例代码
Oct 15 Javascript
jquery实现多屏多图焦点图切换特效的方法
May 04 Javascript
jQuery同步提交示例代码
Dec 12 Javascript
javascript实现label标签跳出循环操作
Mar 06 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
Jan 06 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
Oct 24 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
Apr 24 Javascript
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
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
操作Oracle的php类
2006/10/09 PHP
php设计模式小结
2013/02/15 PHP
PHP实现加强版加密解密类实例
2015/07/29 PHP
如何通过Linux命令行使用和运行PHP脚本
2015/07/29 PHP
JS获取字符串实际长度(包含汉字)的简单方法
2016/08/11 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
node爬取新型冠状病毒的疫情实时动态
2020/02/06 Javascript
JS实现简易计算器
2020/02/14 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
2020/10/13 Javascript
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
Python中多线程及程序锁浅析
2015/01/21 Python
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
Python3之文件读写操作的实例讲解
2018/01/23 Python
python进行文件对比的方法
2018/12/24 Python
基于python图像处理API的使用示例
2020/04/03 Python
django在开发中取消外键约束的实现
2020/05/20 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
竞争性谈判邀请书
2014/02/06 职场文书
创建学习型党组织实施方案
2014/03/29 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
区域销售主管岗位职责
2014/06/15 职场文书
法定代表人资格证明书
2014/09/11 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
党员批评与自我批评
2014/10/15 职场文书
罗马假日观后感
2015/06/08 职场文书
感恩父母主题班会
2015/08/12 职场文书
小学数学教师研修感悟
2015/11/18 职场文书