Javascript 更新 JavaScript 数组的 uniq 方法

2016-02-19 08:59 8 1 收藏

想要天天向上,就要懂得享受学习。图老师为大家推荐Javascript 更新 JavaScript 数组的 uniq 方法,精彩的内容需要你们用心的阅读。还在等什么快点来看看吧!

【 tulaoshi.com - Web开发 】

上次写的一篇《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 方法,万分感谢。

来源:http://www.tulaoshi.com/n/20160219/1589078.html

延伸阅读
标签: Web开发
日一二三四五六'.split('')  ['日','一','二','三','四','五','六']  Array('日','一','二','三','四','五','六')  new Array('日','一','二','三','四','五','六')  这里是输入的代码内容  [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
    JavaScript通过设置数组的length属性来截断数组是惟一一种缩短数组长度的方法.如果使用delete运算符来删除数组中元素,虽然那个元素变成未定义的,但是数组的length属性并不改变两种删除元素,数组长度也改变的方法.   <script     /*    *  方法:Array.remove(dx)    *  功...
标签: Web开发
Javascript的字符串有个indexOf的方法,能够返回字符在指定的字符串中的位置,非常有用,本文介绍了如何给Javascript数组也添加一个类似的方法。 script type="text/javascript"//![CDATA[[].indexOf || (Array.prototype.indexOf = function(v){for(var i = this.length; i-- && this[i] !== v;);return i;});var b =...
标签: Web开发
script language="javascript" function getNoRepeat() { return arguments[0].join('‖').match(/([^‖]+)(?!.*‖1)/ig); } var tmpArr = [1, 'a', 'ab', 'abc', 'd', 1.2, 'a+b', 'd', 'e', 5, 'a', 1, 'h', 'c', 'ab']; var ret...
标签: Web开发
本文是Rick Strahl在使用JavaScript数组上的经验之谈,在一些细微的地方介绍了JavaScript在处理数组上,相对于其他开发语言的不同之处,有些可能是我们自己想当然的事情,但实际上不是那么回事,呵呵。具体涉及到JavaScript数组初始化、length、扩展属性等。 Javascript Array Fun Rick Strahl http://cuimingda.com/2009/01/javascript-ar...

经验教程

480

收藏

84
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部