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 maxlength使用说明
Sep 09 Javascript
关于JAVASCRIPT urldecode URL解码的问题
Jan 08 Javascript
jquery实现动态菜单的实例代码
Nov 28 Javascript
回车直接实现点击某按钮的效果即触发单击事件
Feb 27 Javascript
JavaScript对IE操作的经典代码(推荐)
Mar 10 Javascript
extjs 如何给column 加上提示
Jul 29 Javascript
自己动手手写jQuery插件总结
Jan 20 Javascript
浅谈javascript中replace()方法
Nov 10 Javascript
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
May 07 Javascript
微信小程序wxs实现吸顶效果
Jan 08 Javascript
js实现旋转木马轮播图效果
Jan 10 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
Mar 03 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
如何获得PHP相关资料
2006/10/09 PHP
发布一个用PHP fsockopen写的HTTP下载的类
2007/02/22 PHP
flash用php连接数据库的代码
2011/04/21 PHP
Phpstorm+Xdebug断点调试PHP的方法
2018/05/14 PHP
JSON 教程 json入门学习笔记
2020/09/22 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
jquery制作LED 时钟特效
2015/02/01 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
微信小程序 石头剪刀布实例代码
2017/01/04 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
2018/02/05 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
对vue生命周期的深入理解
2020/12/03 Vue.js
python 实现网上商城,转账,存取款等功能的信用卡系统
2016/07/15 Python
python http接口自动化脚本详解
2018/01/02 Python
浅析python内置模块collections
2019/11/15 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
html5 worker 实例(一) 为什么测试不到效果
2013/06/24 HTML / CSS
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
eBay爱尔兰站:eBay.ie
2019/08/09 全球购物
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
思想政治自我鉴定
2013/10/06 职场文书
文明家庭先进事迹材
2014/01/27 职场文书
电大毕业个人生自我鉴定
2014/03/26 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
少先队辅导员事迹材料
2014/12/24 职场文书
争先创优个人总结
2015/03/04 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript