Javascript 更新 JavaScript 数组的 uniq 方法

 更新时间:2008年01月23日 23:34:17   作者:  
Javascript 更新 JavaScript 数组的 uniq 方法
上次写的一篇《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 方法,万分感谢。

相关文章

  • 原生JS实现微信通讯录

    原生JS实现微信通讯录

    这篇文章主要为大家详细介绍了原生JS实现微信通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • js如何计算斐波那契数列第n项的值

    js如何计算斐波那契数列第n项的值

    这篇文章主要介绍了js如何计算斐波那契数列第n项的值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • JavaScript 原始包装类型汇总

    JavaScript 原始包装类型汇总

    这篇文章主要介绍了JavaScript 原始包装类型汇总,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • JavaScript中关于字符串替换与截取的知识点汇总

    JavaScript中关于字符串替换与截取的知识点汇总

    在日常开发中,经常遇到针对字符串的替换、截取,知识点比较碎容易混淆,所以本文为大家整理了一下相关的知识点,希望对大家有所帮助
    2023-05-05
  • 使用javascript实现页面定时跳转总结篇

    使用javascript实现页面定时跳转总结篇

    下面对使用JavaScript实现页面定时跳转做一下总结,各种定时跳转代码记录如下,希望对大家有所帮助
    2013-09-09
  • javascript onmouseout 解决办法

    javascript onmouseout 解决办法

    最近在做一个简单的鼠标onmouseover时显示层(层里面有多个链接文字),onmouseout 时隐藏层的功能时,发现有诸多问题.
    2010-07-07
  • echarts交互组件与数据的视觉映射

    echarts交互组件与数据的视觉映射

    这篇文章介绍了echarts交互组件与数据的视觉映射,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • JS实现的数组去除重复数据算法小结

    JS实现的数组去除重复数据算法小结

    这篇文章主要介绍了JS实现的数组去除重复数据算法,总结分析了4种比较常见的数组去重复算法及相关使用技巧,需要的朋友可以参考下
    2017-11-11
  • javascript精确统计网站访问量实例代码

    javascript精确统计网站访问量实例代码

    网站一般都有访问量统计工具,比较高效实用的工具多种多样,这篇文章主要介绍了javascript精确统计网站访问量实例代码,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • 浅析document.createDocumentFragment()与js效率

    浅析document.createDocumentFragment()与js效率

    对于循环批量操作页面的DOM有很大帮助!利用文档碎片处理,然后一次性append,并且使用原生的javascript语句操作
    2013-07-07

最新评论