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 顺便学习下CSS选择器 奇偶匹配nth-child(even)
May 24 Javascript
JQuery $.each遍历JavaScript数组对象实例
Sep 01 Javascript
node.js中的require使用详解
Dec 15 Javascript
jQuery实现为控件添加水印文字效果(附源码)
Dec 02 Javascript
jQuery实现返回顶部功能
Feb 23 Javascript
jQuery 调用WebService 实例讲解
Jun 28 Javascript
高效Web开发的10个jQuery代码片段
Jul 22 Javascript
第一次接触神奇的Bootstrap基础排版
Jul 26 Javascript
基于JQuery的Ajax方法使用详解
Aug 16 jQuery
Vue封装的组件全局注册并引用
Jul 24 Javascript
一步一步实现Vue的响应式(对象观测)
Sep 02 Javascript
js 实现验证码输入框示例详解
Sep 23 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运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
2012/06/17 PHP
深入file_get_contents与curl函数的详解
2013/06/25 PHP
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
javascript中创建对象的三种常用方法
2010/12/30 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
JS编程小常识很有用
2012/11/26 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
利用js动态添加删除table行的示例代码
2013/12/16 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
jQuery 中ajax异步调用的四种方式
2016/06/28 Javascript
JS生成随机打乱数组的方法示例
2017/12/23 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
解决vue-cli项目webpack打包后iconfont文件路径的问题
2018/09/01 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
详解vue中localStorage的使用方法
2018/11/22 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
用python爬取租房网站信息的代码
2018/12/14 Python
Python中的 enum 模块源码详析
2019/01/09 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
2019/09/28 Python
Django-xadmin+rule对象级权限的实现方式
2020/03/30 Python
销售部主管岗位职责
2013/12/18 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书
公司员工管理制度
2015/08/04 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
MySQL 如何分析查询性能
2021/05/12 MySQL
python实现简单的井字棋
2021/05/26 Python
TensorFlow的自动求导原理分析
2021/05/26 Python
详解Python+OpenCV进行基础的图像操作
2022/02/15 Python