標籤:輸出時間 中括弧 存在 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學習記錄——數組去重