数组去重的准确编写姿态

弁言

数组去重是前端口试的一个必备题目,其详细表现内容为:如何去掉Javascript的Array的反复项。题目简朴直接,我们也空话不多说,直入主题吧。

平常姿态

运用数组的indexOf()要领能够很简朴的到达目的。

Array.prototype.unique = function() {
    // 建立一个新的暂时数组,用于保留输出效果
    var n = []; 
    // 遍历当前数组
    for (var i = 0; i < this.length; i++) {
        // 假如当前数组的第i个元素已保留进了暂时数组,那末跳过,不然把当前项push到暂时数组内里
        if (n.indexOf(this[i]) == -1) n.push(this[i]);
    }
    return n;
}

再列出一个变更一点的体式格局。

Array.prototype.unique = function() {
    // 建立一个新的暂时数组,而且把当前数组的第一元素存入到数组中
    var n = [this[0]]; 
    // 从第二项最先遍历
    for (var i = 1; i < this.length; i++) 
    {
        // 假如当前数组的第i项在当前数组中第一次涌现的位置不是i,那末示意第i项是反复的,疏忽掉,不然存入效果数组
        if (this.indexOf(this[i]) == i) n.push(this[i]);
    }
    return n;
}

JS引擎在完成indexOf()的时刻会遍历数组直到找到目的为止,此函数会糟蹋掉许多时候。一切这两种体式格局都不是最优的处理体式格局。

// 另一个简约粗犷的要领
Array.prototype.unique = function() {
    return this.filter((v, i) => this.indexOf(v) === i)
}

谢谢oxyflour童鞋供应的简朴粗犷的平常姿态ES6改良版,文雅而简约 :)

最快姿态

把已涌现过的元素经由过程下标的情势存入一个Object内。下标的援用的完成道理应用的是哈希算法,要比用indexOf()搜刮数组快的多。

Array.prototype.unique = function() {
    // n为hash表,r为暂时数组
    var n = {}, r = [];
    for (var i = 0; i < this.length; i++) {
        // 假如hash表中没有当前项
        if (!n[this[i]]) {
            // 存入hash表
            n[this[i]] = true;
            // 把当前数组确当前项push到暂时数组内里
            r.push(this[i]); 
        }
    }
    return r;
}

但从耗时的角度来讲,这是最优的一种处理体式格局。然则从内存占用角度来讲,这并非最优的,由于多了一个hash表。这就是所谓的空间换时候(人间安得双全法?)。

中庸姿态

Array.prototype.unique = function() {
    this.sort();
    var re = [this[0]];
    for (var i = 1; i < this.length; i++) {
        if (this[i] !== re[re.length - 1]) {
            re.push(this[i]);
        }
    }
    return re;
}

这个要领的思绪是先把数组排序,然后比较相邻的两个值。排序的时刻用的JS原生的sort()要领,JS引擎内部应该是用的疾速排序吧。这类体式格局比运用indexOf()平常姿态要快,比运用hash表的最快姿态要慢,然则占用内存要少。所以这算是逆来顺受的一种中庸姿态。详细要用什么姿态,列位看官视情况而定吧。

改编自刘春龙博客中的文章《JS中数组去重题目》

    原文作者:ChanceWong
    原文地址: https://segmentfault.com/a/1190000003984330
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞