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 bind 函数 使用闭包保存执行上下文
Dec 26 Javascript
中文字符串截取的js函数代码
Apr 17 Javascript
JavaScript中的方法调用详细介绍
Dec 30 Javascript
Jquery异步提交表单代码分享
Mar 26 Javascript
基于JavaScript实现div层跟随滚动条滑动
Jan 12 Javascript
JavaScript Array对象详解
Mar 01 Javascript
浅析JS获取url中的参数实例代码
Jun 14 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
Nov 01 Javascript
快速掌握jQuery插件开发
Jan 19 Javascript
jQuery简单实现向列表动态添加新元素的方法示例
Dec 25 jQuery
js实现全选反选不选功能代码详解
Apr 24 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 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
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
PHP转换文本框内容为HTML格式的方法
2016/07/20 PHP
PHP面试常用算法(推荐)
2016/07/22 PHP
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
2013/02/05 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
两种不同的方法实现js对checkbox进行全选和反选
2014/05/13 Javascript
document.write的几点使用心得
2014/05/14 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
React 实现拖拽功能的示例代码
2019/01/06 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
2019/03/01 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
百度小程序自定义通用toast组件
2019/07/17 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
2020/06/24 jQuery
[00:32]DOTA2上海特级锦标赛 Ehome战队宣传片
2016/03/03 DOTA
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
python如何制作英文字典
2019/06/25 Python
python redis连接 有序集合去重的代码
2019/08/04 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
python安装virtualenv虚拟环境步骤图文详解
2019/09/18 Python
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
.NET面试题:什么是值类型和引用类型
2016/01/12 面试题
国外的一些J2EE面试题一
2012/10/13 面试题
市场营销管理制度
2014/01/29 职场文书
工厂会计员职责
2014/02/06 职场文书
文艺晚会策划方案
2014/06/11 职场文书
物业保安岗位职责
2014/07/02 职场文书
2014年餐厅服务员工作总结
2014/11/18 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书