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 07 Javascript
js 模拟气泡屏保效果代码
Jul 10 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
Feb 10 Javascript
jQuery插件-jRating评分插件源码分析及使用方法
Dec 28 Javascript
jQuery中replaceAll()方法用法实例
Jan 16 Javascript
JavaScript实现DIV层拖动及动态增加新层的方法
May 12 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
Aug 07 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
Dec 03 Javascript
jQuery焦点图左右转换效果
Dec 12 Javascript
VUE基于NUXT的SSR 服务端渲染
Nov 30 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
Feb 28 Javascript
Element MessageBox弹框的具体使用
Jul 27 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导出生成word的方法
2015/12/25 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
js showModalDialog 弹出对话框的简单实例(子窗体)
2014/01/07 Javascript
Bootstrap每天必学之前端开发框架
2015/11/19 Javascript
利用css+原生js制作简单的钟表
2020/04/07 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
vue使用axios实现文件上传进度的实时更新详解
2017/12/20 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
jQuery使用each遍历循环的方法
2018/09/19 jQuery
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
微信小程序8种数据通信的方式小结
2020/02/03 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
python实现xlsx文件分析详解
2018/01/02 Python
Python温度转换实例分析
2018/01/17 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
Python实现ping指定IP的示例
2018/06/04 Python
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
对Pandas MultiIndex(多重索引)详解
2018/11/16 Python
python使用adbapi实现MySQL数据库的异步存储
2019/03/19 Python
python安装requests库的实例代码
2019/06/25 Python
python实现简单银行管理系统
2019/10/25 Python
Pytorch释放显存占用方式
2020/01/13 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
西班牙在线光学:Visual-Click
2020/06/22 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
网吧收银员岗位职责
2013/12/14 职场文书
《歌唱二小放牛郎》教学反思
2014/04/19 职场文书
纪念九一八事变演讲稿:忘记意味着背叛
2014/09/14 职场文书
师德师风整改措施
2014/10/24 职场文书
社区节水倡议书
2015/04/29 职场文书