數(shù)組去重

<!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> 數(shù)組去重 </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 > JavaScript indexOf() 方法</a>
<p>
    indexOf() 方法可返回某個(gè)指定的字符串值在字符串中首次出現(xiàn)的位置,從0開(kāi)始計(jì)算是复。<br>
    var liang = "Hello liang liang ye se"; <br>
    var l = liang.indexOf("liang"); <br>
    console.log(l); // 6 <br>
    如果沒(méi)有找到匹配的字符串則返回 -1。<br>

    注意: indexOf() 方法區(qū)分大小寫画机。<br>
</p>
<a > JavaScript sort() 方法</a>
<p>
    sort() 方法用于對(duì)數(shù)組的元素進(jìn)行排序。<br>

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

    默認(rèn)排序順序?yàn)榘醋帜干颉?lt;br>
    sort(字母降序)array.reverse(); <br>
    array.reverse() 方法用于顛倒數(shù)組中元素的順序绣的。 <br>

    注意:當(dāng)數(shù)字是按字母順序排列時(shí)"40"將排在"5"前面。<br>

    使用數(shù)字排序欲账,你必須通過(guò)一個(gè)函數(shù)作為參數(shù)來(lái)調(diào)用屡江。<br>

    函數(shù)指定數(shù)字是按照升序還是降序排列。<br>

    注意: 這種方法會(huì)改變?cè)紨?shù)組赛不!惩嘉。<br>

</p>
<a > ES6中的 Map 與 Set </a>
<p>
    Map對(duì)象 <br>
    Map是ES6 提供的新的數(shù)據(jù)結(jié)構(gòu)。 <br>
    Map 對(duì)象保存鍵值對(duì)踢故。任何值(對(duì)象或者原始值) 都可以作為一個(gè)鍵或一個(gè)值文黎。 <br>

    Set對(duì)象 <br>
    Set 對(duì)象允許你存儲(chǔ)任何類型的 唯一值 惹苗,無(wú)論是原始值或者是對(duì)象引用。 <br>
    Set對(duì)象是值的集合耸峭,你可以按照插入的順序迭代它的元素桩蓉。 <br>
    Set中的元素只會(huì)出現(xiàn)一次,即 Set 中的元素是唯一的劳闹。 <br>
    Set對(duì)象和Map對(duì)象一樣触机,都有一個(gè)size屬性,他返回Set對(duì)象的值的個(gè)數(shù)玷或。 <br>

    filter() 方法創(chuàng)建一個(gè)新的數(shù)組儡首,新數(shù)組中的元素 是 通過(guò)檢查 指定數(shù)組 中 符合條件的所有元素。 <br>

    Array.from() 方法從一個(gè)類似數(shù)組或可迭代的對(duì)象(包括 Array偏友,Map蔬胯,Set,String位他,TypedArray氛濒,arguments 對(duì)象等等) 中創(chuàng)建一個(gè)新的數(shù)組實(shí)例 <br>

    箭頭函數(shù) <br>
    1、箭頭函數(shù)寫代碼擁有更加簡(jiǎn)潔的語(yǔ)法鹅髓; <br>
    2舞竿、不會(huì)綁定this。 <br>
</p>

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

        // sort(數(shù)字升序)
        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(數(shù)字降序)
        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(); // 顛倒數(shù)組中元素的順序
        console.log(fruits); // 降序后 (4) ["Orange", "Mango", "Banana", "Apple"]


        // 1.最簡(jiǎn)單數(shù)組去重法
        // 新建一新數(shù)組窿冯,遍歷傳入數(shù)組骗奖,值不在新數(shù)組就push進(jìn)該新數(shù)組中
        // IE8以下不支持?jǐn)?shù)組的indexOf方法

        function liang1(array) {
            var temp = []; //一個(gè)新的臨時(shí)數(shù)組
            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.數(shù)組下標(biāo)法
        //  還是得調(diào)用“indexOf”性能跟方法1差不多,
        //  實(shí)現(xiàn)思路:如果當(dāng)前數(shù)組的第i項(xiàng)在當(dāng)前數(shù)組中第一次出現(xiàn)的位置不是i醒串,
        //  那么表示第i項(xiàng)是重復(fù)的执桌,忽略掉。否則存入結(jié)果數(shù)組芜赌。

        function liang2(array) {
            var temp = [];
            for (var i = 0; i < array.length; i++) {
                //如果當(dāng)前數(shù)組的第i項(xiàng)在當(dāng)前數(shù)組中第一次出現(xiàn)的位置是i仰挣,才存入數(shù)組;否則代表是重復(fù)的
                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.排序后相鄰去除法
        //  給傳入數(shù)組排序缠沈,排序后相同值相鄰膘壶,
        //  然后遍歷時(shí),新數(shù)組只加入不與前一值重復(fù)的值。
        //  會(huì)打亂原來(lái)數(shù)組的順序

        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.優(yōu)化遍歷數(shù)組法
        // 思路:獲取沒(méi)重復(fù)的最右一值放入新數(shù)組
        // 實(shí)現(xiàn)思路:獲取沒(méi)重復(fù)的最右一值放入新數(shù)組洲愤。
        // 檢測(cè)到有重復(fù)值時(shí)終止當(dāng)前循環(huán)同時(shí)進(jìn)入頂層循環(huán)的下一輪判斷
        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); // 獲取到?jīng)]重復(fù)的值 (8) ["B", "C", "A", 2, 3, 1, 4, "D"]
            console.log(index); // 獲取到?jīng)]重復(fù)的下標(biāo) (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.對(duì)象鍵值法去重
        //  速度最快颓芭, 占空間最多(空間換時(shí)間)
        //  該方法執(zhí)行的速度比其他任何方法都快, 就是占用的內(nèi)存大一些禽篱。
        //  現(xiàn)思路:新建一js對(duì)象以及新數(shù)組畜伐,遍歷傳入數(shù)組時(shí),判斷值是否為js對(duì)象的鍵躺率,
        //  不是的話給對(duì)象新增該鍵并放入新數(shù)組玛界。
        //  注意點(diǎn):判斷是否為js對(duì)象鍵時(shí)万矾,會(huì)自動(dòng)對(duì)傳入的鍵執(zhí)行“toString()”,
        //  不同的鍵可能會(huì)被誤認(rèn)為一樣慎框,例如n[val]-- n[1]良狈、n["1"];
        //  解決上述問(wèn)題還是得調(diào)用“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 數(shù)組去重
        function liang6(arr6) {
            //定義常量 res,值為一個(gè)Map對(duì)象實(shí)例
            const res = new Map();
            //返回arr數(shù)組過(guò)濾后的結(jié)果薪丁,結(jié)果為一個(gè)數(shù)組
            //過(guò)濾條件是,如果res中沒(méi)有某個(gè)鍵馅精,就設(shè)置這個(gè)鍵的值為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 數(shù)組去重
        function liang7(arr7) {
            //通過(guò)Set對(duì)象严嗜,對(duì)數(shù)組去重洲敢,結(jié)果又返回一個(gè)Set對(duì)象
            //通過(guò)from方法漫玄,將Set對(duì)象轉(zhuǎn)為數(shù)組
            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 數(shù)組去重
        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 ... 將字符串轉(zhuǎn)為真正的數(shù)組
        var liang = [...'椋椋夜色']
        console.log(liang); // 轉(zhuǎn)換后 (4) ["椋", "椋", "夜", "色"]
    </script>

</body>
</html>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市压彭,隨后出現(xiàn)的幾起案子睦优,更是在濱河造成了極大的恐慌,老刑警劉巖壮不,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汗盘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡询一,警方通過(guò)查閱死者的電腦和手機(jī)隐孽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)家凯,“玉大人缓醋,你說(shuō)我怎么就攤上這事“砘澹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵褪贵,是天一觀的道長(zhǎng)掂之。 經(jīng)常有香客問(wèn)我,道長(zhǎng)脆丁,這世上最難降的妖魔是什么世舰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮槽卫,結(jié)果婚禮上跟压,老公的妹妹穿的比我還像新娘。我一直安慰自己歼培,他們只是感情好震蒋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布茸塞。 她就那樣靜靜地躺著,像睡著了一般查剖。 火紅的嫁衣襯著肌膚如雪钾虐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天笋庄,我揣著相機(jī)與錄音效扫,去河邊找鬼。 笑死直砂,一個(gè)胖子當(dāng)著我的面吹牛菌仁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播静暂,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼掘托,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了籍嘹?” 一聲冷哼從身側(cè)響起闪盔,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辱士,沒(méi)想到半個(gè)月后泪掀,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颂碘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年异赫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片头岔。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塔拳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峡竣,到底是詐尸還是另有隱情靠抑,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布适掰,位于F島的核電站颂碧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏类浪。R本人自食惡果不足惜载城,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望费就。 院中可真熱鬧诉瓦,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至猴贰,卻和暖如春对雪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背米绕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工瑟捣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人栅干。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓迈套,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親碱鳞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桑李,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容