JS基础入门篇(十五)—数组去重

目的:把数组中重复的内容去掉。
eg:将数组[2, 3, 1, 4, 2, 2, 3, 4, 1, 5,”1″]变成[2, 3, 1, 4, 5, “1”]。

思路1:

每次取出数组 一项,和其他的所有项比较
如果比较 有相同的 , 把重复的这个(后面的)删掉。

<script>
    var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 5,"1"];
    //遍历数组
    for(var i=0;i<arr.length;i++){
        //每次比较i 之后的内容
        for(var j=i+1;j<arr.length;j++){
            if(arr[i]===arr[j]){
                //删除后面的这一个。
                //j是位置,1表示长度。
                //这个方法不清楚的  可以看我这一篇文章 https://segmentfault.com/a/1190000014973607
                arr.splice(j,1);
                //删除之后,数组长度会减1,要想比较剔除的后面一位。由于数组长度变短,后一位提前了,故j要减1。
                j--;
            }
        }
    }
    console.log(arr);
</script>

思路二:

准备一个 空数组 res
    然后遍历 arr
        如果 arr中这一项 在 res中不存在,
            则把这一项 放进 res中
        如果 存在
            什么都不做
            
最后得到的res,就是去重得到后的数组。
<script>
    var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 4, "1"]; // [2,3,1,4]
    var res=[2];
    for(var i=0;i<arr.length;i++){
        //返回值不等于-1则表明,res中没有arr[i],这一项。
        if(compare(res,arr[i])!==-1){
           //往res中添加arr[i]这一项
            res.push(arr[i]);
        }
    }

    console.log(res);
    
    function compare(res,arr) {
        for(var j=0;j<res.length;j++) {
            //如果遍历res过程中有相等值的话,立刻返回-1,结束遍历。
            if(arr === res[j])
                return -1;
        }
        //如果for 循环结束了,还没跳出函数,表示res中没有arr,则返回1。
        return j;
    }
</script>

思路一和思路二存在的缺点:如果数组内容中含有两个NAN,由于NAN不等于它自己。故删选不出来。

思路三:

统计所有项出现的次数,形成一个对象
        对象的键名 是 每一项的元素 ,
        对象的键值 是 该项出现的次数.
最后我们只需要 统计所有的键名就可以了
<script>
    var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 4, 2]; // [2,3,1,4]
    var res={};
    var resArr=[];
    //    {
    //        2: 4,
    //        3: 2,
    //        1: 2,
    //        4: 3
    //    }

    for(var i=0;i<arr.length;i++){
        // 键名 in 对象
        // 如果对象中有此键名,则返回true
        // 否则,返回false
        if(arr[i] in res){
            //存在,则对应的键值+1。
            res[ arr[i] ]+=1;
        }else{
            //不存在,则设置对应键名,并且键值=1。
            res[ arr[i] ]=1;
        }
    }
    //遍历对象
    for(i in res){
        //将键名插入数组
        resArr.push(i);
    }
    console.log(resArr);
</script>

这个方法存在的问题就是:

1.如果数组中存在数字1,和字符串“1”,当遍历键名的时候,两则是一样的,得到的数组会少了数字1.
2.键名是以字符串的方式存储的,插入数组的时候,也是以字符串的方式存储到数组中去。

改进思路三

<script>
    var arr = [2, 2, 3, 4, 1, 4, 2,"1",undefined]; // [2,3,1,4]
    var res={};
    var resArr=[];
    //    {
    //        2: 4,
    //        3: 2,
    //        1: 2,
    //        4: 3
    //    }

    for(var i=0;i<arr.length;i++){
        //键名是 数据类型的前三位+arr[i]组成的字符串。
        temp=(typeof arr[i]).substr(0,3)+arr[i];
        if(temp in res){
            res[ temp ]+=1;
        }else{
            res[ temp ]=1;
        }
    }
    console.log(res);
    for(i in res){
        // 截取 键名的前三位
        // substr(0,3)包括开始,不包括结束。截取的字符串 0,1,2位
        var temp=i.substr(0,3);
        if(temp=="num"){
            //截取 键名从第三位开始截取。
            resArr.push(Number(i.substring(3)));
        }
        if(temp=="str"){
            resArr.push(i.substr(0,3));
        }
        if(temp=="und"){
            resArr.push(undefined);
        }
    }
    console.log(resArr);
</script>

思路四

使用 es6的Set ...
<script>
            var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 4, 2, "1", NaN, NaN]; // [2,3,1,4]
            //Set方法可以去除数组内重复的
            // ... 表明展开数组的每一项
            var res=[...(new Set(arr))];
            console.log(res);
        
</script>   
    原文作者:梁志芳
    原文地址: https://segmentfault.com/a/1190000015119121
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞