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 相关文章推荐
跨浏览器的设置innerHTML方法
Sep 18 Javascript
jquery实现的超出屏幕时把固定层变为定位层的代码
Feb 23 Javascript
javascript学习笔记(十三) js闭包介绍(转)
Jun 20 Javascript
jquery创建一个ajax关键词数据搜索实现思路
Feb 26 Javascript
js中实现多态采用和继承类似的方法
Aug 22 Javascript
JavaScript截取字符串的2个函数介绍
Aug 27 Javascript
JavaScript中数组添加值和访问值常见问题
Feb 06 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
Jul 14 Javascript
jQuery选择器实例应用
Jan 05 Javascript
js+css实现红包雨效果
Jul 12 Javascript
微信小程序调用微信支付接口的实现方法
Apr 29 Javascript
Element Collapse 折叠面板的使用方法
Jul 26 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
服务器web工具 php环境下
2010/12/29 PHP
PHP的基本常识小结
2013/07/05 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
php类的定义与继承用法实例
2015/07/07 PHP
比较完整的微信开发php代码
2016/08/02 PHP
thinkPHP框架中执行事务的方法示例
2018/05/31 PHP
图片自动更新(说明)
2006/10/02 Javascript
jQuery中的.bind()、.live()和.delegate()之间区别分析
2011/06/08 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
招聘网站基于jQuery实现自动刷新简历
2015/05/10 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
js HTML5手机刮刮乐代码
2020/09/29 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
js设置鼠标悬停改变背景色实现详解
2019/06/26 Javascript
JavaScript实现背景自动切换小案例
2019/09/27 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
2020/08/31 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
编程语言Python的发展史
2014/09/26 Python
python机器学习库xgboost的使用
2020/01/20 Python
解决paramiko执行命令超时的问题
2020/04/16 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
企业党员公开承诺书
2014/03/26 职场文书
大学新生入学教育方案
2014/05/16 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
个人专业技术总结
2015/03/05 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js