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在页面中绘制表格核心代码
Sep 16 Javascript
使用jQuery实现input数值增量和减量的方法
Jan 24 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
Aug 21 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
Aug 28 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
Sep 19 Javascript
图片旋转、鼠标滚轮缩放、镜像、切换图片js代码
Dec 13 Javascript
JavaScript模版引擎的基本实现方法浅析
Feb 15 Javascript
node.js实现回调的方法示例
Mar 01 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
Aug 04 jQuery
Webpack之tree-starking 解析
Sep 11 Javascript
Vue+abp微信扫码登录的实现代码示例
Jan 06 Javascript
Json实现传值到后台代码实例
Jun 30 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 curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
Jqyery中同等与js中windows.onload的应用
2011/05/10 Javascript
js静态方法与实例方法分析
2011/07/04 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
javascript实现在指定元素中垂直水平居中
2015/09/13 Javascript
JavaScript事件 &quot;事件对象&quot;的注意要点
2016/01/14 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
HTML中setCapture、releaseCapture 使用方法浅析
2016/09/25 Javascript
如何使用headjs来管理和异步加载js
2016/11/29 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
小程序双头slider选择器的实现示例
2020/03/31 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
记录Django开发心得
2014/07/16 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
python在线编译器的简单原理及简单实现代码
2018/02/02 Python
Python facenet进行人脸识别测试过程解析
2019/08/16 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
2019/11/26 Python
关于python中导入文件到list的问题
2020/10/31 Python
利用Python批量识别电子账单数据的方法
2021/02/08 Python
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
英国和国际包裹递送:ParcelCompare
2019/08/26 全球购物
Internal修饰符有什么含义
2013/07/10 面试题
linux面试题参考答案(9)
2015/01/07 面试题
医科学校毕业生自荐信
2013/11/09 职场文书
成考报名单位证明范本
2014/01/16 职场文书
会员活动策划方案
2014/08/19 职场文书
解除劳动合同协议书范本2014
2014/09/25 职场文书
学生退学证明
2015/06/23 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers