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读写cookie实现一个底部广告浮层效果的两种方法
Dec 29 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
May 08 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
Aug 11 Javascript
基于JavaScript实现智能右键菜单
Mar 02 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
Mar 13 Javascript
详解jQuery中的deferred对象的使用(一)
May 27 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
May 28 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
Jul 12 Javascript
如何实现星星评价(jquery.raty.js插件)
Dec 21 Javascript
jQuery图片缩放插件smartZoom使用实例详解
Aug 25 jQuery
微信小程序实现电子签名并导出图片
May 27 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 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生成文件
2007/01/15 PHP
PHP中header和session_start前不能有输出原因分析
2013/01/11 PHP
PHP中提问频率最高的11个面试题和答案
2014/09/02 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
2015/03/18 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
PHP explode()函数用法讲解
2019/02/15 PHP
一个不错的用JavaScript实现的UBB编码函数
2007/03/09 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
Vue.directive()的用法和实例详解
2018/03/04 Javascript
vue中Element-ui 输入银行账号每四位加一个空格的实现代码
2018/09/14 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
Python爬虫爬验证码实现功能详解
2016/04/14 Python
Python 爬虫学习笔记之单线程爬虫
2016/09/21 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
wxPython之解决闪烁的问题
2018/01/15 Python
Python3中的bytes和str类型详解
2019/05/02 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
python3 实现调用串口功能
2019/12/26 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
使用CSS3美化HTML表单的技巧演示
2016/05/17 HTML / CSS
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
英国领先的鞋类零售商:Shoe Zone
2018/12/13 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
个人找工作求职简历的自我评价
2013/10/20 职场文书
毕业生自我推荐
2013/11/04 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书