無標題文檔

JavaScript 数组的 uniq 方法

请给 Array 本地对象增加一个原型方法,它的用途是删除数组条目中重复的条目(可能有多个),
返回值是一个包含被删除的重复条目的新数组。

Lazy 兄弟给出了它自己的解法,而我个人认为这样的解法算法上还有需要改进的地方。正如回复中 fdcn 兄弟所说,如果将数组:[1, 2, 3, 3, null, null, 2] 带入 Lazy 兄的函数,那么按照循环判断条件就会退出,导致数组之后的元素就不会判断了。

下面给出我的解决方法:

Array.prototype.uniq = function(){
    var tmp    = new Array;
    var length = this.length;

    for(var i = 0; i < length; i++) {
        var push = true;
        var item = this[i];

        for(var j = i + 1; j < length; j++) {
            if(this[j] == item) {
                push = false;
            }
        }

        if(push == true) {
            tmp.push(item)
        }
    }

    return tmp;
}

Lazy 兄弟也说到每次循环都将重新计算 length 会有开销,那么我将 legth 定义为一个常量,原数组为「只读」,那么 length 相对不变,就不要重复计算了。然后再定义一个数组往里面扔「垃圾」。

数组嵌套循环并不遍历原数组的每一个元素,仅判断剩余没有出现的值。最后获得一个是否 push 的布尔值,然后跳出循环判断是否插入。

最后,欢迎大家交流讨论。


更新,和 Lazy 兄弟讨论后,我发现此函数写得也不是非常的严谨。因为它没有修改原函数的元素,于是我又作了如下的修改:

Array.prototype.uniq = function(){
    var tmp    = new Array;
    var length = this.length;

    for(var i = 0; i < length; i++) {
        var push = true;
        var item = this[i];

        for(var j = i + 1; j < length; j++) {
            if(this[j] == item) {
                push = false;
            }
        }

        if(push) {
            tmp.push(item)
        }
    }

    this.length = tmp.length;
    for (var i = 0; i < tmp.length; i++) {
        this[i] = tmp[i];
    }

    return tmp;
}

但这样又出现了一个问题,就是重复赋值会不会增加时间长度。因为我是在取出来了以后再做一次循环重新赋值给原数组。按照我这样的写法实现已经没有问题,但是效率可能需要进一步的调整。

继续改进ing


不好意思,再次更新。根据上述的问题,我重新优化了下算法,并将 Lazy 兄弟的「思想」加了进来,于是就有如下的代码了:

Array.prototype.uniq = function(){
    var i = 0, j = 0;
    while (undefined !== this[i]){
        j = i + 1;
        while(undefined !== this[j]){
            if (this[i] === this[j]) {
               this.splice(j, 1);
            }
            ++j;
        }

        ++i;
    }

    return this;
}

是的,非常的短,不过却能完成题目所给的要求了。这个相对我以前的函数,有一个好处就是没有生成另外的一个数组。而且也没有像第二个函数这样的重复赋值。

嗯,我想目前这个样子已经能满足题目的要求了。

Vim/Cscope 入门指导

Cscope 确实能给开发带来不少的方便。这篇篇幅不长的 Vim/Cscope 入门指导 可以让大家很快熟悉怎么使用 Vim 编辑器 调用 Cscope。

由于翻译的时间比较短(加上本人水平不高又很懒),有错误的地方请兄弟们不吝指出。废话不多说,下面是一些下载链接:

HTML 版本 PDF 版本 ZIP 打包(PDF 版本)

另,需要学习 Vim 的朋友可以看下上次翻译的 清单式学习 VI 编辑器 文档。

-- UPDATE--

2008-09-24 更改下载链接

已经连续加了一个月的班了

最近似乎心烦的事情特别的多。不知不觉已经连续加班一个月了,期间也曾经闹过几次情绪,不过到最后还是偃旗息鼓了。回过头来想想,发现自己有些自虐的倾向:就算偶尔的几天不加班,发现夜晚过得特别得漫长。

似乎现在人都在亚健康的状态上徘徊,我现在开始担心我会不会过劳了。相比其他的任何东西,我觉得没有什么比健康更重要的了。

在这里我点名批评下 wiLdGoose 兄弟 ,前几天我得知他又病了,上吐下泻。这小子太不爱惜自己了。

https://friable.rocks/_/2007_12_04/464424690.jpg

加班也不仅仅是我目前这个公司的特色,其他公司也一样。 某时某公司的某人 ,还在办公室里累得睡着了。我的一个朋友也说过,搞 IT 的就是拿自己的青春当赌注。看来,确实是这样。

说道这里,想起来某次饭局上的经典话语。「程序员好比是小×姐,越到晚上越精神;两者都是拿自己的身子换取生计、都是吃青春的饭碗;他们之间唯一的区别就是程序员所面对的是老×板,而小×姐的客户除了老×板还有广大民众。」

想到这里,我觉得我还是幸福的:「构建和×谐×社×会,全面建设小×康×生×活」。

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章