数组去重

<!DOCTYPE html>
<html lang="zh-CN">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title> 数组去重 </title>

JavaScript indexOf() 方法 : https://www.runoob.com/jsref/jsref-indexof.html

JavaScript sort() 方法 : https://www.runoob.com/jsref/jsref-sort.html

ES6中的 Map 与 Set : https://www.runoob.com/w3cnote/es6-map-set.html

</head>

<a href="https://www.runoob.com/jsref/jsref-indexof.html"> JavaScript indexOf() 方法</a>
<p>
    indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置,从0开始计算。<br>
    var liang = "Hello liang liang ye se"; <br>
    var l = liang.indexOf("liang"); <br>
    console.log(l); // 6 <br>
    如果没有找到匹配的字符串则返回 -1。<br>

    注意: indexOf() 方法区分大小写。<br>
</p>
<a href="https://www.runoob.com/jsref/jsref-sort.html"> JavaScript sort() 方法</a>
<p>
    sort() 方法用于对数组的元素进行排序。<br>

    排序顺序可以是字母或数字,并按升序或降序。<br>
    sort(数字升序)array.sort(function(a,b){return a-b}); <br>
    sort(数字降序)array.sort(function(a,b){return b-a}); <br>

    默认排序顺序为按字母升序。<br>
    sort(字母降序)array.reverse(); <br>
    array.reverse() 方法用于颠倒数组中元素的顺序。 <br>

    注意:当数字是按字母顺序排列时"40"将排在"5"前面。<br>

    使用数字排序,你必须通过一个函数作为参数来调用。<br>

    函数指定数字是按照升序还是降序排列。<br>

    注意: 这种方法会改变原始数组!。<br>

</p>
<a href="https://www.runoob.com/w3cnote/es6-map-set.html"> ES6中的 Map 与 Set </a>
<p>
    Map对象 <br>
    Map是ES6 提供的新的数据结构。 <br>
    Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。 <br>

    Set对象 <br>
    Set 对象允许你存储任何类型的 唯一值 ,无论是原始值或者是对象引用。 <br>
    Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 <br>
    Set中的元素只会出现一次,即 Set 中的元素是唯一的。 <br>
    Set对象和Map对象一样,都有一个size属性,他返回Set对象的值的个数。 <br>

    filter() 方法创建一个新的数组,新数组中的元素 是 通过检查 指定数组 中 符合条件的所有元素。 <br>

    Array.from() 方法从一个类似数组或可迭代的对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等) 中创建一个新的数组实例 <br>

    箭头函数 <br>
    1、箭头函数写代码拥有更加简洁的语法; <br>
    2、不会绑定this。 <br>
</p>

<body>
    <script>
        // indexOf() 的使用
        var liang = "Hello liang liang ye se";
        var l = liang.indexOf("liang");
        console.log(l); // 6

        // sort(数字升序)
        var points = [20, 100, 1, 6, 25, 10, 55];
        points.sort()
        console.log(points); // 升序前 (7) [1, 10, 100, 20, 25, 55, 6]
        points.sort(function (a, b) {
            return a - b
        });
        console.log(points); // 升序后 (7) [1, 6, 10, 20, 25, 55, 100]

        // sort(数字降序)
        var points = [20, 100, 1, 6, 25, 10, 55];
        points.sort()
        console.log(points); // 降序前 (7) [1, 10, 100, 20, 25, 55, 6]
        points.sort(function (a, b) {
            return b - a
        });
        console.log(points); // 降序后 (7) (7) [100, 55, 25, 20, 10, 6, 1]

        // sort(字母降序)
        var fruits = ["Banana", "Orange", "Apple", "Mango"];
        fruits.sort();
        console.log(fruits); // 降序前 (4) ["Apple", "Banana", "Mango", "Orange"]
        fruits.reverse(); // 颠倒数组中元素的顺序
        console.log(fruits); // 降序后 (4) ["Orange", "Mango", "Banana", "Apple"]


        // 1.最简单数组去重法
        // 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中
        // IE8以下不支持数组的indexOf方法

        function liang1(array) {
            var temp = []; //一个新的临时数组
            for (var i = 0; i < array.length; i++) {
                if (temp.indexOf(array[i]) == -1) {
                    temp.push(array[i]);
                }
            }
            return temp;
        }
        var arr1 = [1, 2, 3, 3, 2, 1];
        console.log(arr1); // 去重前 (6) [1, 2, 3, 3, 2, 1]
        console.log(liang1(arr1)); // 去重后 (3)[1, 2, 3,]

        // 2.数组下标法
        //  还是得调用“indexOf”性能跟方法1差不多,
        //  实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,
        //  那么表示第i项是重复的,忽略掉。否则存入结果数组。

        function liang2(array) {
            var temp = [];
            for (var i = 0; i < array.length; i++) {
                //如果当前数组的第i项在当前数组中第一次出现的位置是i,才存入数组;否则代表是重复的
                if (array.indexOf(array[i]) == i) {
                    temp.push(array[i])
                }
            }
            return temp;
        }
        var arr2 = [1, 2, 3, "A", "B", "C", "C", "B", "A", 3, 2, 1];
        console.log(arr2); // 去重前 (12) [1, 2, 3, "A", "B", "C", "C", "B", "A", 3, 2, 1]
        console.log(liang2(arr2)); // 去重后 (6) [1, 2, 3, "A", "B", "C"]

        //  3.排序后相邻去除法
        //  给传入数组排序,排序后相同值相邻,
        //  然后遍历时,新数组只加入不与前一值重复的值。
        //  会打乱原来数组的顺序

        function liang3(array) {
            array.sort();
            var temp = [array[0]];
            for (var i = 1; i < array.length; i++) {
                if (array[i] !== temp[temp.length - 1]) {
                    temp.push(array[i]);
                }
            }
            return temp;
        }
        var arr3 = [1, 2, 3, "A", "B", "C", "C", "B", "A", 3, 2, 1, 4, "D"];
        console.log(arr3); // 去重前 (12) [1, 2, 3, "A", "B", "C", "C", "B", "A", 3, 2, 1 , 4 ,"D"]
        console.log(liang3(arr3)); // 去重后 (6) [1, 2, 3, 4,"A", "B", "C" ,"D"]

        // 4.优化遍历数组法
        // 思路:获取没重复的最右一值放入新数组
        // 实现思路:获取没重复的最右一值放入新数组。
        // 检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断
        function liang4(array) {
            var temp = [];
            var index = [];
            var l = array.length;
            for (var i = 0; i < l; i++) {
                for (var j = i + 1; j < l; j++) {
                    if (array[i] === array[j]) {
                        i++;
                        j = i;
                    }
                }
                temp.push(array[i]);
                index.push(i);
            }
            console.log(temp); // 获取到没重复的值 (8) ["B", "C", "A", 2, 3, 1, 4, "D"]
            console.log(index); // 获取到没重复的下标 (8) [6, 7, 8, 9, 10, 11, 12, 13]
            return temp;
        }
        var arr4 = [1, 2, 3, "A", "B", "C", "B", "C", "A", 2, 3, 1, 4, "D"];
        console.log(arr4); // 去重前 (14) [1, 2, 3, "A", "B", "C", "B", "C", "A", 2, 3, 1, 4, "D"]
        console.log(liang4(arr4)); // 去重后 (8) ["B", "C", "A", 2, 3, 1, 4, "D"]

        // 5.对象键值法去重
        //  速度最快, 占空间最多(空间换时间)
        //  该方法执行的速度比其他任何方法都快, 就是占用的内存大一些。
        //  现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,
        //  不是的话给对象新增该键并放入新数组。
        //  注意点:判断是否为js对象键时,会自动对传入的键执行“toString()”,
        //  不同的键可能会被误认为一样,例如n[val]-- n[1]、n["1"];
        //  解决上述问题还是得调用“indexOf”。

        function liang5(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) {
                    temp[val].push(type);
                    r.push(val);
                }
            }
            return r;
        }
        var arr5 = [1, 2, 3, "A", "B", "C", "B", "C", "A", 2, 3, 1, 4, "D"];
        console.log(arr5); // 去重前 (14) [1, 2, 3, "A", "B", "C", "B", "C", "A", 2, 3, 1, 4, "D"]
        console.log(liang5(arr5)); // 去重后 (8) [1, 2, 3, "A", "B", "C", 4, "D"]

        // 6.1 ES6 数组去重
        function liang6(arr6) {
            //定义常量 res,值为一个Map对象实例
            const res = new Map();
            //返回arr数组过滤后的结果,结果为一个数组
            //过滤条件是,如果res中没有某个键,就设置这个键的值为1
            return arr6.filter((a) => !res.has(a) && res.set(a, 1))
        }
        var arr6 = [1, 2, 3, "A", "B", "C", "B", "C", "A", 2, 3, 1, 4, "D"];
        console.log(arr6); // 去重前 (14) [1, 2, 3, "A", "B", "C", "B", "C", "A", 2, 3, 1, 4, "D"]
        console.log(liang6(arr6)); // 去重后 (8) [1, 2, 3, "A", "B", "C", 4, "D"] 

        // 6.2 ES6 数组去重
        function liang7(arr7) {
            //通过Set对象,对数组去重,结果又返回一个Set对象
            //通过from方法,将Set对象转为数组
            return Array.from(new Set(arr7))
        }
        var arr7 = [1, 2, 3, "A", "B", "C", "B", "C", "A", 2, 3, 1, 4, "D"];
        console.log(arr7); // 去重前 (14) [1, 2, 3, "A", "B", "C", "B", "C", "A", 2, 3, 1, 4, "D"]
        console.log(liang6(arr7)); // 去重后 (8) [1, 2, 3, "A", "B", "C", 4, "D"]

        // 6.3 ES6 数组去重
        var arr8 = [1, 2, 3, "A", "B", "C", "B", "C", "A", 2, 3, 1, 4, "D"];
        var liang8 = [...new Set(arr8)]
        console.log(liang8); // 去重后 (8) [1, 2, 3, "A", "B", "C", 4, "D"]

        // ES6 ... 将字符串转为真正的数组
        var liang = [...'椋椋夜色']
        console.log(liang); // 转换后 (4) ["椋", "椋", "夜", "色"]
    </script>

</body>
</html>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容