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 相关文章推荐
Autocomplete Textbox Example javascript实现自动完成成功
Aug 17 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
Oct 24 Javascript
javascript实现的简单计时器
Jul 19 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
Oct 23 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
Nov 15 Javascript
跟我学习javascript的函数调用和构造函数调用
Nov 16 Javascript
如何利用JSHint减少JavaScript的错误
Aug 23 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
Feb 09 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
Jul 07 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
Nov 01 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
Dec 06 Javascript
vue实现图书管理系统
Dec 29 Vue.js
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 使用redis锁限制并发访问类示例
2016/11/02 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
PHP Swoole异步MySQL客户端实现方法示例
2019/10/24 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
document.open() 与 document.write()的区别
2007/08/13 Javascript
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
JS获取网页属性包括宽、高等等
2014/04/03 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
详解Vue中的基本语法和常用指令
2019/07/23 Javascript
详解使用JWT实现单点登录(完全跨域方案)
2019/08/02 Javascript
Python做文本按行去重的实现方法
2016/10/19 Python
Python常用库推荐
2016/12/04 Python
Python制作钉钉加密/解密工具
2016/12/07 Python
Python命令行解析模块详解
2018/02/01 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
美国综合购物商城:UnbeatableSale.com
2018/11/28 全球购物
自我评价格式
2014/01/06 职场文书
应届优秀本科大学毕业生自我鉴定
2014/01/21 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
《他得的红圈圈最多》教学反思
2014/04/24 职场文书
银行求职信怎么写
2014/05/26 职场文书
销售行政专员岗位职责
2014/06/10 职场文书
交通志愿者活动总结
2014/06/27 职场文书
模范班主任事迹材料
2014/12/17 职场文书
全国法制宣传日活动总结
2015/05/05 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL
CDPR谈《巫师》新作用虚幻5原因 称不会为Epic独占
2022/04/06 其他游戏