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 相关文章推荐
js计数器代码
Nov 04 Javascript
50款非常棒的 jQuery 插件分享
Mar 29 Javascript
禁止你的左键复制实用技巧
Jan 04 Javascript
一个JavaScript获取元素当前高度的实例
Oct 29 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
Dec 20 Javascript
jQuery中outerHeight()方法用法实例
Jan 19 Javascript
Javascript数组操作函数总结
Feb 05 Javascript
Javascrip实现文字跳动特效
Nov 27 Javascript
用 js 的 selection range 操作选择区域内容和图片
Apr 18 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
May 03 Javascript
js实现多张图片延迟加载效果
Jul 17 Javascript
JavaScript解析及序列化JSON的方法实例分析
Jan 04 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+AJAX实现投票功能的方法
2015/09/28 PHP
PHP5.5迭代生成器用法实例详解
2016/03/16 PHP
学习并汇集javascript匿名函数
2010/11/25 Javascript
菜鸟javascript基础资料整理2
2010/12/06 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
jquery 插件学习(一)
2012/08/06 Javascript
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
jquery插件开发之实现md5插件
2014/03/17 Javascript
基于JQuery制作可编辑的表格特效
2014/12/23 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
2016/09/09 Javascript
jquery实现图片跟随鼠标的实例
2017/10/17 jQuery
vue实现循环切换动画
2018/10/17 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
javascript中innerHTML 获取或替换html内容的实现代码
2020/03/17 Javascript
[06:07]辉夜杯现场观众互动 “比谁远送显示器”
2015/12/26 DOTA
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
python3.7.0的安装步骤
2018/08/27 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
Python实现分数序列求和
2020/02/25 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
2020/02/25 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
Django日志及中间件模块应用案例
2020/09/10 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
教导处工作制度
2014/01/18 职场文书
学习经验交流会主持词
2014/04/01 职场文书
工作岗位说明书模板
2014/05/09 职场文书
司机岗位职责
2015/02/04 职场文书
经营目标责任书
2015/05/08 职场文书
Pytorch中的数据集划分&正则化方法
2021/05/27 Python
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle
SQL注入篇学习之盲注/宽字节注入
2022/03/03 MySQL