数组去重的几种方法-基础篇

不知怎么就想到这里了,动手总结算,算是给自己看的吧。
尽量做到简单易懂。注释清楚。包括些许基础的知识点。(就是文字表达不行,懒得想,直接注释了。)
直接进入主题。没有demo,基本控制台都可以测试。

!!!基础篇。 建立在array的值都是基本类型的情况。TODO


第一种: 基本可以摈弃。当时还不知道数组的一些方法,就纯用for去实现的。(按照思路写的,又稍许更改)

//TODO 这里是有问题的。如果不是传进来的不是array,需要转化为array或者告知错误。鉴于是基础篇章,就不展开了。之后找机会下一篇。
function unique1(arr) {
    if (arr === undefined) {   //设置默认值,也可以通过ES6 参数设置默认值。
        arr = [1, 2, 1, 2, 3, 'a', 'b', 'a', 'c'];
    }

    var result = [];  
    result.push(arr.shift(1))  //直接把arr第一个值push到result里。Array.prototype.shift/push 都会更改使用此方法的数组
    var len = arr.length;

    //原数组作为外层循环遍历,内层循环reuslt因为值会改变,就不提取len出来。
    for (var i = 0; i < len; i++) {
        for (var j = 0; j < result.length; j++) {
            if (arr[i] === result[j]) {   //当arr[i]的某一项等于result的任意一项就跳出此次内层循环。
                    break; 
            }
            if (j === result.length - 1) {  //如果遍历完result的所有项都没有重复的的情况下讲当前arr[i]push到result里。
                result.push(arr[i])
            }
        }
    }
    return result;
}

第二种: 利用Array.prototype.indexof() 来处理。(事实上,自己在用第一种方法解决问题后,没过几天就看到了这个inexof。觉得自己当时真实蠢到爆。)

indexOf()方法返回在数组中可以找到给定元素的第一个索引,如果不存在,则返回-1。

function unique2(arr = [1, 2, 1, 2, 3, 'a', 'b', 'a', 'c']) {  //嗯。推荐关键词  “ES6 函数参数的默认值”
    var result = [];
    for (var i in arr) {   //和之后的for of 对比来看。
        if (result.indexOf(arr[i]) === -1) {  //判断如果arr[i]不存在于result数组里面,就push该元素到result里。
            result.push(arr[i]);
        } 
    }
    return result;
}

代码很简单,也不细说了。
这里相对第一种,代码量减少很多。(第一种其实就是这种思路没有内置方法的实现)。


第三种: 逻辑—先把arr排序。然后遍历arr每个值,判断其和result最后1个值是否相等,来决定是否将此值推入数组。

function unique3(arr = [1, 2, 1, 2, 3, 'a', 'b', 'a', 'c']) {
    var result = [] //之前给result[0]赋值其实就为了减少不必要的循环而已。不一定需要给result[0]赋值。
    arr.sort();
    for (var value of arr) {  //嗯。for of/if 就单纯在这里的差别可以理解为一个 是 遍历到 当前的 value ,一个是遍历到当前的index
        if (value !== result[result.length - 1]) { //当value=1,也就是arr[0]时,result[result.length - 1] = undefined 
            result.push(value)
        }
    }
    return result;
}

第四种:利用ES6的Set(set有点类似数组,但是它本身是不能重复的。!。本身就帮我们去重了)。然后我们将其转为数组就好了。

集合(Set)对象允许你存储任意类型的唯一值(不能重复),无论它是原始值或者是对象引用。

function unique4(arr = [1, 2, 1, 2, 3, 'a', 'b', 'a', 'c']) {
    var set = new Set(arr)  //得到去重后的set。

    var result1 = Array.from(set) //method1: from 可以从一个类数组对象或可遍历对象中创建一个新的数组。 

    var result2 = [...set]; //method2: 使用拓展运算符

    var result3 = [];  //method3: 使用for...of循环。
    for (v of set) {
        result3.push(v)
    }
    return {
        array_from: result1,
        spreading :result2,
        for_of    :result3,
    }
}

TODO 第四种。嗯,自己也仅处于会“用”的阶段而已。代完善。
(2017/5/14 1:40。写到这里回头看,发现挖坑好多。争取早日填坑。)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值