【前端笔试题】数组去重

数组去重

题目来自于自己真实笔试,现在总结到博文,算是给自己的再一次复习吧,另外也可以与大家分享。


最初的实现

我记得我第一次的答案是这样写的:

for (var i = 0; i < arr1.length; i++) {
    for (var j = i+1; j < arr1.length; j++) { // 从第i+1个元素遍历数组
        // 如果当前数组元素相同
        if (arr1[i] == arr1[j]) {
            arr2.push(arr1[j]); // 把相同的元素push到数组arr2中
            arr1.splice(j,1); // 并删除更新原数组arr1
        }
    }
}

然后测试是这样:

var arr1 = [1,2,3,4,2,5,6,1,7,8,4];
var arr2 = [];

//测试
document.write('去重数组:' + arr1 + " 重复项:" + arr2);
//结果: 去重数组:1,2,3,4,5,6,7,8 重复项:1,2,4

虽然思想结果都是对的,但是我当时真的只是为作答而作答,并没有想着去完善一个去重的功能,去分析它的性能。后来学习到原型prototype这个知识点,然后改进了下方法。将方法写在数组的原型上,这样就可以直接调用去重方法,实习去重,另外也会去在写每一个方法时去考虑它的性能。

去重方法1:

/**
 * [unique1 数组去重方法1]
 * 
 * 利用array indexOf
 * @return {[Array]} [去重后的数组]
 */
Array.prototype.unique1 = function()
    {
        var temp = []; // 一个新的临时数组
        for(var i = 0; i < this.length; i++) // 遍历当前数组
        {
            //判断是否临时数组中有该遍历的元素存在
            if (temp.indexOf(this[i]) == -1) {
                temp.push(this[i]); // 若不存在,则push到临时数组里面
            }
        }
        return n;
    }

去重方法2:

/**
* [unique2 数组去重方法2]
 * 
 * 利用array indexOf
 * @return {[Array]} [去重后的数组]
 */
Array.prototype.unique2 = function()
{
    var temp = [this[0]]; // 把数组首个元素存入临时数组
    for(var i = 1; i < this.length; i++) //从数组元素第2个开始遍历
    {
        //判断第i项元素是否在临时数组中第一次出现的位置是i,
        if (this.indexOf(this[i]) == i) { // 如果不是i,表示是重复项
            n.push(this[i]); // 如果是i,就push元素到临时数组中
        }
    }
    return n;
}

去重方法3:

/**
* [unique3 数组去重方法3]
 * 
 * 利用array sort方法先排序
 * @return {[Array]} [去重后的数组]
 */
Array.prototype.unique1 = function() {
    this.sort(); // 进行基础排序 
    var temp = [this[0]]; // 将数组第1个元素存入临时数组中
    for(var i = 1; i < this.length; i ++) { // 从数组第2个元素遍历数组
        // 判断遍历的元素和临时数组最后一个元素是否相同,
        if (this[i] !== temp[temp.length-1]) { 
            temp.push(this[i]); // 如果不相同,那就push到临时数组
        }
    }
    return temp; // 返回临时数组
}

测试:

var arr = [1,2,3,4,2,5,6,1,7,8,4];
// 方法1
document.write('去重数组:' + arr.unique1()); // 去重数组:1,2,3,4,5,6,7,8

// 方法2
document.write('去重数组:' + arr.unique2()); // 去重数组:1,2,3,4,5,6,7,8

// 方法2
document.write('去重数组:' + arr.unique3()); // 去重数组:1,2,3,4,5,6,7,8

结果都是一样的,但是从性能来说,第三种方法效率要高于前两种,因为前两种方法使用的indexOf(),要去把整个数组所有元素搜索一遍,如果遇到很长的数组,效率可想而知很不理想,而第三种是先进行基础排序,然后再去比较两个元素,不需要把整个数组搜索一遍,所以执行效率要更好。

当然数组去重的方法很多,我只是举例出其中的三个,很乐意其他朋友分享交流指正


咳咳,还是那句话

还是要不断学习的,因为自己还很年轻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值