Javascript學習記錄——數組去重

來源:互聯網
上載者:User

標籤:輸出時間   中括弧   存在   ram   bsp   date()   儲存   條件   若是   

 var arr = [1, 2, 3, 5, 5, ‘45‘, ‘45‘, 4, 1, ‘1‘, ‘2‘]    for (var i = 0; i < 10000; i++) {        arr.push(i)//這裡給arr添加10000項,方便後面對各個方法效能的觀看    }    /**     * 方法一:借用一個結果數組,原數組中的元素與結果數組進行比較,若是不存在與原數組全等的元素,則將原數組元素存入結果數組中。     * @param arr 傳入的數組     * @returns {Array} 返回的去重後的數組     */    function useArr(arr) {//封裝函數        var start = +new Date()//得到初始時間        var resultArr = []//建立一個resultArr,用來儲存非重複元素        resultArr.push(arr[0])//在resultArr可以任意添加一個arr中的元素,保證後面能進入到內層for迴圈中        for (var i = 1; i < arr.length; i++) {//遍曆arr,從索引為1的元素開始            var flag = true//這裡利用假設成立法聲明一個變數,假設arr中的第i項與resultArr中的每一項都不全等。            for (var j = 0; j < resultArr.length; j++) {//遍曆resultArr                if (arr[i] === resultArr[j]) {//將arr的第i項與resultArr中的每一項進行比較                    flag = false//如果resultArr中存在與arr第i項全等的元素,那麼假設不成立,令flag為false,                    break//既然有了重複的項,那麼其他的項也就不用比了,直接結束內層for迴圈                }            }            if (flag) {//如果假設成立,即resultArr中沒有與arr第i全等的元素,那麼就將arr添加到resultArr中                resultArr.push(arr[i])            }        }        var end = +new Date()//得到結束時間        console.log(end - start)//輸出時間差       結果約為 260ms        return resultArr//返回結果數組    }    console.log(useArr(arr))    /**     * 方法二:arr中的元素與後面元素比較,如果存在與之全等的元素,則刪除後面元素     * @param arr     * @returns {Array}     */    function useArr1(arr) {//封裝函數        var start = +new Date()//得到初始時間        for (var i = 0; i < arr.length; i++) {//遍曆arr            for (var j = i + 1; j < arr.length; j++) {//遍曆第i項後面的所有項                if (arr[i] === arr[j]) {//比較第i項與其後面的所有項                    arr.splice(j, 1)//若存在第J項與第i項全等,則刪除第j項                    j--//因為刪除了一項j,j+1項會變為j項,為使得後面的比較順利進行,這時就要進行j--                }            }        }        var end = +new Date()//得到結束時間        console.log(end - start)//輸出時間差     結果約為 193ms        return arr;//返回去重後的原數組    }    console.log(useArr1(arr))    /**     * 方法三:使用indexOf,尋找resultArr中是否存在與arr中相等的元素,若沒有則將arr的元素放入resultArr中     * @param arr 傳入的數組     * @returns {Array} 返回的去重後的數組     */    function useArr2(arr) {//封裝函數        var start = +new Date()//得到初始時間        var resultArr = []//建立一個resultArr,存放非重複元素        for (var i = 0; i < arr.length; i++) {//遍曆arr            if (resultArr.indexOf(arr[i]) == -1) {//在resultArr中尋找是否存在與arr的第i項相等的元素,結果為-1表示不存在(indexOf尋找的是全等元素)                resultArr.push(arr[i])//結果數組中若不存在與arr第i項相等的元素,則將arr的第i項存入resultArr中            }        }        var end = +new Date()//得到結束時間        console.log(end - start)//輸出時間差     結果約為244ms        return resultArr//返回結果數組    }    console.log(useArr2(arr))    /**     * 方法四:數組中元素與自身元素進行比較,跳過有重複項的左值,每次取沒有重複項的最右值,     * @param arr 傳入的數組     * @returns {Array} 返回的去重後的數組     */    function useArr3(arr) {//封裝函數        var start = +new Date()//得到初始時間        var resultArr = []//建立一個resultArr,儲存去重後的元素        for (var i = 0; i < arr.length; i++) {//遍曆arr            for (var j = i + 1; j < arr.length; j++) {//取出第i項後面的比較項                if (arr[i] === arr[j]) {                    j = ++i//如果在第i項後面存在與第i項全等的元素,那麼就跳過第i項,從i+1項開始,再次比較(雖然內層迴圈還在繼續                           //但外層相當於進入下一次的i迴圈),直到內層for迴圈走完依舊沒有全等的元素                }            }            resultArr.push(arr[i])//如果第i項後面與之全等的元素,那麼就將arr的第i項添加到resultArr中        }        var end = +new Date()//得到結束時間        console.log(end - start)//輸出時間差     結果約為 214ms        return resultArr//返回去重後的數組    }    console.log(useArr3(arr))    /**     * 方法五:使用對象,在對象中尋找是否存在以數組元素為屬性的屬性,若是不存在,則將該元素添加到對象的屬性中,     *        因為中括弧內的屬性名稱都是以字串形式進行尋找,因此會將類似數值1與字串‘1‘當做重複項,這時就要     *        可以將數值元素的類型值作為屬性值儲存在對應的屬性中     * @param arr 傳入的數值     * @returns {Array} 返回的去重後的數值     */    function useArr4(arr) {//封裝函數        var start = +new Date()//得到初始時間        var obj = {}, resultArr = [];//建立一個Null 物件,進行比較,一個空數組儲存非重複元素        for (var i = 0; i < arr.length; i++) {//遍曆arr            var type = typeof arr[i]//聲明一個變數,儲存數組中第i項元素值的類型            if (!obj[arr[i]]) {//判斷:如果對象中的數組元素屬性不存在                obj[arr[i]] = type//那麼就將數組元素儲存為對象的屬性,並將數組元素值的類型儲存為屬性值                resultArr.push(arr[i])//同時將滿足條件的數組元素添加到resultArr中            } else if (obj[arr[i]].indexOf(type) == -1) {//接著判斷:未滿足上一個if條件的所有arr的元素進入到這個else if中,以這些元素作為對象的屬性尋找屬性值                //如果沒有與之相等(不全等)的屬性的屬性值,也就是數組中存在與該相等但不全的元素,那麼就將該元素添加到resultArr中                resultArr.push(arr[i])            }        }        var end = +new Date()//得到結束時間        console.log(end - start)//輸出時間差     結果約為 3ms        return resultArr//返回去重後的數組    }    console.log(useArr4(arr))    //方法五的效能最佳,但是建立了一個對象,佔用空間即記憶體大,空間換時間

 

Javascript學習記錄——數組去重

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.