原生js对一个数组去重的五种方法

先定义一个用于去重的数组arr = [1,2,"2",4,9,"a","a",2,3,5,6,5]

(1)method 1: 新建一个空数组,对原数组进行遍历,如果新数组中没有则添加

function unique (array) {
    var tmp = []
    array.forEach(function (value) {
        if(tmp.indexOf(value)===-1) {
            tmp.push(value)
        }
    })
    console.log(tmp)
}
    unique(arr)

(2)method 2: 使用对象键值——对象的键不重复

function unique(array){
    var temp = {}, r = [], len = array.length, val, type;
    for (var i = 0; i < len; i++) {
        val = array[i];
        type = typeof val
        if (!temp[val]) {
            temp[val] = [type]
            r.push(val)
            } else if (temp[val].indexOf(type) < 0) {// 区分数字2 和 字符2
                temp[val].push(type)
                r.push(val)
                }
    }
    return r
}
    console.log(unique(arr))

(3)method 3: 排序后相邻重复则去除,当相同元素的不同类型(比如数字类型和字符类型)同时出现在数组中时时会出现问题,要慎用

function unique (array) {
    if(array.length<=0) return 
    array.sort()
    var tmp = []
    tmp.push(array[0])
    for(var i=1;i<array.length-1;i++) {
        if(array[i]!==tmp[tmp.length-1])
        tmp.push(array[i])
    }
    console.log(tmp)
}
unique(arr)

(4)method 4: 借助数组下标

function unique(array) {
    var temp = []
    for (var i=0;i<array.length;i++) {
        if(array.indexOf(array[i])===i)
            temp.push(array[i])
        }
        console.log(temp)
}
unique(arr)

(5)优化两重循环遍历数组,找到右侧重复元素则终止当前循环,开始数组中的下一个元素与右侧所有元素进行比较

         首先感谢可爱的人一次次指正错误,目前确定为正确方案

function unique (array) {
    var temp = []
    var len = array.length
    for(var i=0;i<len;i++) {
        for(var j=i+1;j<len;j++) {
            if(array[i]===array[j]) {
                j = ++i
                console.log("i "+i, "j "+j);
             }
        }temp.push(array[i])
     }console.log(temp)
}
var arr = [1,2,3,3,4,5,2,10,1,0,5,6]
unique(arr)

 右侧为结果截图:

第五种方法类似于使用两个指针i和j,i指针指向当前要判断是否与右侧元素重复的元素,j指针开始时指向i指向的下一个元素并且遍历右侧元素,若找到相等元素则将i指针后移,j指针与i指针指向同一个元素,在进入新的内层循环时,j指针自增1(因为会先执行j++,有关for循环的执行规则看下方解释),指向下一个元素。



// for循环的表达式之间用的是;号分隔的,千万不要写成,
for (初始化表达式1; 判断表达式2; 自增表达式3) {
    // 循环体4
}

执行顺序:1243  ----  243   -----243(直到循环条件变成false)

1. 初始化表达式
2. 判断表达式
3. 自增表达式
4. 循环体

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值